2012-10-17 40 views
5

Veritabanında kalıcı olması gereken bir tekil var. Diğer kalıcı varlıklar bu tektona referans göstermelidir. Hazırda bekletme ile nasıl başarılabilir?Hazırda bekletme/kalıcılık ve tekil kalıbı

bir şey tekiz tek kimliğini taklit, böyle zaman henüz çalışma ile sona erdi

:

@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; 
} 

Sorun varlıklar yabancı anahtar referans içeren bir sütun istiyorum kalmamasıdır Singleton - çünkü singleton sadece bir tane ve kimliğine ihtiyacımız yok ...

Belki yanlış bir şekilde düşünüyorum? Belki yanlış mimarlık meselesidir? Benzer sorunu çözdünüz mü?

cevap

0

Singleton yalnızca bir nesneyse, neden başka varlıklar arasında eşlemek istiyorsunuz?

Bir kez Singleton yüklemek ve application context içine koymak isteyebilirsiniz. Bu durumda, ihtiyacınız olduğunda yeniden kullanabilirsiniz.

+0

Evet ama ne kabı yeniden gerekiyorsa veya birçok konteyner varsa? Tekillerin mevcut durumu nasıl kaydedilir? Veya tüm kaplarda değiştirebilir misin? – ElderMael

+0

Bu şekilde tasarlanan nesne var. Tek denediğim, bunu başka varlıklar içinde eşlemek için hiçbir sebep görmediğimi söylemek. Nesneyi bir kez yükleyin ve uygulama içeriğinde saklayın. Konteyneri yeniden başlatırsanız tekrar yükleyin. –

+0

1. Veritabanında veri değişebileceğinden (webapp daha fazla düğümde) 2. İşletmenin iş mantığı yöntemlerinde singleton'a ihtiyacı olduğu için. Ve buna "el ile" koymak istemiyorum. Bu DAO hizmeti tarafından yüklenen varlıklar için DAO hizmeti tarafından yapılabilir, ancak dolaylı olarak yüklenen (orijinal varlık tarafından başvurulan) varlıklar ile ne yapmalı? – Jakub

1

bu ile sona erdi:

@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... 
}