2009-05-24 19 views
3

Entschuldigung, wenn dies ein Repost ist, konnte ich die Suchbegriffe nicht finden, um eine ähnliche Frage zu finden.Spring + Hibernate Dynamic Mapping

Die Anwendung, an der ich arbeite, unterstützt Plugins, die zur Laufzeit geladen oder entladen werden können. Es gibt mehrere API-Hooks, die es diesen Plugins ermöglichen, unter anderem reichere Objekte zu registrieren, als solche, die im Lieferumfang enthalten sind. Wenn ein Plugin aktiviert wird und ein neues Domain-Objekt registriert, muss ich Hibernate auf das neue Objekt hinweisen (und das Entfernen des Objekts, wenn das Plugin deaktiviert ist). Alle unsere Objekte sind mit JPA/Hibernate-Annotationen markiert.

System-Klasse

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING) 
@DiscriminatorValue("CORE") 
public class User { 
    protected @Id @GeneratedValue int id; 
    protected String userName; 

    ... 
} 

Plugin-Klasse (in einer JAR-Klassenladeprogramm gefunden)

@Entity 
@DiscriminatorValue("LDAP_USER") 
public class LdapUser extends User { 
    protected boolean active; 

    ... 
} 

Plugin Einspeisepunkt API hook

public void activate() { 
    UserManager.getInstance().registerType(LdapUser.class); 
} 

public void deactivate() { 
    UserManager.getInstance().unregisterType(LdapUser.class); 
} 

Ich weiß, dass hybernate die Konfiguration des Mappings über einige APIs unterstützt, aber ich weiß auch, dass dies ernsthafte Auswirkungen haben kann, wenn es aktive Sitzungen gibt.

Also meine Frage ist: Wie kann ich die aktuelle Mapping-Konfiguration 'in-Flight' rekonfigurieren und erweitern, wenn Spring meine Sitzungen verwaltet.

+0

sehr interessante Frage – dfa

Antwort

3

Wenn Sie keine vorherigen Sitzungsdaten behalten müssen, können Sie Ihre SessionFactory einfach mit einer neuen Konfiguration und einer neuen Liste von Klassen zerstören/neu erstellen. Die Änderung der Konfiguration einer Session Factory Mid-App scheint mir unwahrscheinlich, aber vielleicht kann jemand mit einem besseren Hibernate-Fu mir das Gegenteil beweisen.