2012-10-17 12 views
5

Tôi có một singleton được lưu giữ trong cơ sở dữ liệu. Các thực thể tồn tại khác nên có tham chiếu đến singleton này. Làm thế nào nó có thể đạt được với Hibernate?Hibernate/persistence và singleton pattern

tôi đã kết thúc với một cái gì đó không-chưa-làm việc như thế này, giả mạo ID duy nhất của singleton:

@Entity 
@Subselect("select '1' as ID") 
class Singleton { 
    @Id 
    @Column(name="ID") 
    private Long getId() { return 1l; } 
    private void setId(Long id) { } 
} 

@Entity 
@Table(name="ENT") 
class MyEnt { 
    // TODO: how to annotate so that table ENT doesn't need foreign key column 
    Singleton s; 
} 

Vấn đề là tôi không muốn có một cột với khóa ngoại trong thực thể tham khảo Singleton - bởi vì singleton chỉ là một và chúng tôi không cần ID của nó ...

Có lẽ tôi đang suy nghĩ một cách sai lầm? Có lẽ nó là vấn đề kiến ​​trúc sai? Bạn đã giải quyết vấn đề tương tự?

Trả lời

0

Nếu Singleton chỉ là một đối tượng, tại sao bạn muốn ánh xạ nó trong các thực thể khác?

Bạn có thể tải Singleton một lần và đặt nó trong application context. Trong trường hợp đó, bạn có thể sử dụng lại nó bất cứ khi nào bạn cần.

+0

Có nhưng những gì nếu bạn cần phải khởi động lại bình đựng chất hay bạn có nhiều container? Làm thế nào để lưu trạng thái hiện tại của singleton? Hoặc thay đổi nó trong tất cả các thùng chứa? – ElderMael

+0

Tôi có nghĩa là có đối tượng đó theo cách được thiết kế. Tất cả tôi đang cố gắng để nói rằng tôi không thấy bất kỳ lý do nào để ánh xạ điều này trong các thực thể khác. Tải đối tượng một lần và giữ trong bối cảnh ứng dụng. Nếu bạn tình cờ khởi động lại vùng chứa, hãy tải lại. –

+0

1. Vì dữ liệu có thể thay đổi trong cơ sở dữ liệu (webapp có nhiều nút hơn) 2. vì thực thể cần singleton trong các phương thức logic nghiệp vụ của nó. Và tôi không muốn đặt nó vào "thủ công". Nó có thể được thực hiện bởi dịch vụ DAO cho các thực thể được nạp bởi dịch vụ DAO này, nhưng phải làm gì với các thực thể, được nạp gián tiếp (được tham chiếu bởi thực thể gốc)? – Jakub

1

tôi đã kết thúc với điều này:

@Entity 
@Subselect("select '1' as ID, * from TABLE") 
class Singleton { 
    @Id 
    @Column(name="ID") 
    private Long getId() { return 1l; } 
    private void setId(Long id) { } 
    // ... other useful fields persisted in TABLE 
} 

@Entity 
@Table(name="ENT") 
class MyEnt implements Lifecycle { 
    Singleton s; 
    void onLoad(Session sess, Serializable id) { 
     this.s = sess.get(Singleton.class, 1l); 
    } 
    // etc... 
}