2012-10-17 17 views
5

Ho un singleton che deve essere mantenuto nel database. Altre entità persistenti dovrebbero fare riferimento a questo singleton. Come può essere raggiunto con Hibernate?Hibernate/Persistenza e Pattern singleton

ho finito con qualcosa di non-ancora-a lavorare in questo modo, fingendo l'unico ID del 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; 
} 

Il problema è che io non voglio avere una colonna con chiave esterna in entità riferimento the Singleton - perché il singleton è solo uno e non abbiamo bisogno del suo ID ...

Forse sto pensando in modo sbagliato? Forse è un problema di architettura sbagliato? Hai risolto un problema simile?

risposta

0

Se Singleton è un solo oggetto, perché si desidera mapparlo in altre entità?

È possibile caricare Singleton una volta e inserirlo in application context. In tal caso, puoi riutilizzarlo ogni volta che ne hai bisogno.

+0

Sì, ma cosa succede se è necessario riavviare il contenitore o hai molti contenitori? Come salvare lo stato corrente del singleton? O cambiarlo in tutti i contenitori? – ElderMael

+0

Intendevo avere quell'oggetto nel modo progettato. Tutto quello che sto provando, così dico che non vedo alcuna ragione per mappare questo in altre entità. Carica l'oggetto una volta e mantieni il contesto dell'app. Se ti capita di riavviare il contenitore, caricarlo di nuovo. –

+0

1. Poiché i dati possono cambiare nel database (la webapp è su più nodi) 2. perché l'entità ha bisogno del singleton nei suoi metodi di business logic. E non voglio metterlo dentro "manualmente". Potrebbe essere eseguito dal servizio DAO per le entità caricate da questo servizio DAO, ma cosa fare con le entità caricate indirettamente (a cui fa riferimento l'entità originale)? – Jakub

1

ho finito con questo:

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