Frage

Ich arbeite an einem Projekt mit einigen ungewöhnlichen Wesen Beziehungen, die ich Probleme persistierenden mit JPA habe. Es gibt zwei relevante Objekte; User und sie nennen die anderen X. Benutzer eine Eins-zu-viele haben und zwei Eins-zu-eins-Beziehungen zu X. Es sieht im Grunde wie diese

[User Entität]

@OneToMany(mappedBy="user", cascade=CascadeType.ALL, orphanRemoval=true)  
private List<X> xList;

@OneToOne  
@JoinColumn(name = "active_x1_id")  
private X activeX1;  

@OneToOne  
@JoinColumn(name = "active_x2_id")  
private X activeX2;

[X Einheit]

@ManyToOne()  
@JoinColumn(name="user_id")  
private User user;

Wenn Sie einen neuen Benutzer persistierenden, möchte ich auch zwei x Einheiten bestehen bleiben (eine für activeX1 und eine für activeX2) in einer einzigen Transaktion. JPA behandelt diese abit seltsam, die Protokoll sieht wie folgt aus:

INSERT INTO X VALUES (...) // x1  
INSERT INTO USERS VALUES (...)  
INSERT INTO X() VALUES (...) // x2  
UPDATE USERS SET ...  
UPDATE X VALUES (...) // updates x1  

Dies macht es unmöglich, in der Datenbank NOT NULL Einschränkungen zu verwenden. Gibt es einen besseren Weg, um diese vielfältigen Beziehungen zu handhaben? Oder eine Art und Weise zu steuern, welche um JPA weiterhin besteht Objekte? JPA scheint wirklich explizit in diesem Betrieb zu arbeiten gegen mich zu versuchen. Jede mögliche Hilfe würde geschätzt.

War es hilfreich?

Lösung 2

Solved with the use of EntityManager.flush method, forcing JPA to persist the user first.

user.setProperties(properties);
em.persist(user);
em.flush();

X x1 = new X(user);
user.setActiveX1(x1);
X x2 = new X(user);
user.setActiveX2(x2);

I still have to allow null values on the activeX-column of user, but that is alright as I can at least force not null on X.

Andere Tipps

Why don't you just use @NotNull annotation? I don't think there is a way to change persist order. You have to do it manually. Something like this,

User user = ...;

if ( user.getActiveX1().getId() == null ) {
      entityManager.persist( user.getActiveX1() );
} else {
      entityManager.merge( user.getActiveX1() );
}

if ( user.getActiveX2().getId() == null ) {
      entityManager.persist( user.getActiveX2() );
} else {
      entityManager.merge( user.getActiveX2() );
}

if ( user.getId() == null ) {
      entityManager.persist( user );
} else {
      entityManager.merge( user );
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top