2012-10-17 7 views
5

Ich habe ein Singleton, das in der Datenbank beibehalten werden soll. Andere persistente Entitäten sollten einen Verweis auf diesen Singleton haben. Wie kann es mit Hibernate erreicht werden?Ruhezustand/Persistenz und Singleton-Muster

ich mit etwas noch nicht arbeiten wie diese beendet, die einzelne ID des Singletons fälschen:

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

Das Problem ist, dass ich Referenzierung nicht über eine Spalte mit Fremdschlüssel in Einheiten haben wollen der Singleton - weil der Singleton nur einer ist und wir seine ID nicht brauchen ...

Vielleicht denke ich falsch? Vielleicht ist es ein falsches Architekturproblem? Haben Sie ein ähnliches Problem gelöst?

Antwort

0

Wenn Singleton nur ein Objekt ist, warum möchten Sie es in anderen Entitäten zuordnen?

Sie möchten Singleton einmal laden und in application context setzen. In diesem Fall können Sie es jederzeit wiederverwenden.

+0

Ja, aber was ist, wenn Sie den Container neu starten müssen oder Sie viele Container haben? Wie speichere ich den aktuellen Status des Singletons? Oder ändern Sie es in allen Containern? – ElderMael

+0

Ich meinte, dass das Objekt in der Art und Weise gestaltet ist. Alles, was ich versuche, sage ich, dass ich keinen Grund sehe, dies in anderen Entitäten abzubilden. Laden Sie das Objekt einmal und bleiben Sie im App-Kontext. Wenn Sie den Container neu starten, laden Sie ihn erneut. –

+0

1. Da sich die Daten in der Datenbank ändern können (webapp befindet sich auf mehreren Knoten) 2. weil die Entität den Singleton in ihren Geschäftslogikmethoden benötigt. Und ich möchte es nicht "manuell" darin einfügen. Es könnte vom DAO-Dienst für Entitäten ausgeführt werden, die von diesem DAO-Dienst geladen werden, aber was mit Entitäten zu tun ist, die indirekt geladen werden (von der ursprünglichen Entität referenziert)? – Jakub

1

ich mit diesem endete:

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