Hibernate version:
3.0.5
Pseudocode:
Code:
class Customer {
private String name;
private Set orders;
...
public void setName(String name){
notifyListener(...);
this.name = name;
}
public void getName() { ...}
public void setOrders(Set orders){
notifyListener(...);
this.orders = orders;
}
public void addChangeListener(Listener listener){
... listenerlist.add(listener);
}
private void notifiyListener(){
... for each listener in listenerlist: notify(...)
}
}
class Order {
...
}
Pseudomapping Code:
<class name="Customer" ....
...
<property name="name" .../>
<set name="orders" table="n_m" lazy="false">
<key column="customer_id"/>
<many-to-many class="Order" column="order_id"/>
</set>
...
</class>
<class name="Order" .... >
...
</class>
Hallo,
ich moechte fuer meine POJOs einen PropertChange-Event anbieten, der auch auf Hibernate-Aktivitaeten reagiert. D.h. wenn Hibernate Attribute einer existierenden Instanz aendert (wie beim session.refresh(...) ), dann sollte dies einen Event ausloesen.
Im Beispiel-Code ist eine m:n-Beziehung zwischen Customer und Order skizziert. Beliebige Interessenten können sich als ChangeListener bei individuellen Instanzen von Customer eintragen.
Die Benachrichtigung sollte bei
einfachen Attributen sicherlich funktionieren, doch weiss ich nicht, wie es sich mit Sets (java.util.Set) verhaelt. Hibernate
uebergibt natuerlich eine Realisierung von java.util.Set beim Aufruf von setOrders(java.util.Set order), doch kann ich mich auf dem Set selbst nicht als ChangeListener eintragen. Insbesondere bin ich an ChangeEvents im Set selbst interessiert, die u.a. auch durch Hibernate ausgeloest werden. Zum Beispiel beim Aufruf von session.refresh(customerA) koennte sich ja durchaus die Menge der assoziierten Ordereintraege im Set aendern ohne dass das Set selbst ausgetauscht wird (in Customer)
Haette ich die Moeglichkeit, das Set selbst zu implementieren, dann koennte ich einfach vor jedem Aufruf wie zum Beispiel .add(...), .remove(...), etc. den Notificication-Code einfuegen. Das Set wird jedoch von Hibernate geliefert (siehe org.hibernate.collection.*)
Erste Experimente ergaben, dass Hibernate auch beim Aufruf von session.refresh(customerA) das Set an sich (setOrders(...)) neu uebergibt, doch weiss ich nicht, ob ich mich darauf verlassen kann.
Auf Tipps, an welcher Stelle ich mich am besten
einniste bin ich sehr gespannt ... oder bin ich schon so code-blind und versuche ein No-Problem zu loesen ;-)