3

私は、JPA で問題が発生しているいくつかの異常なエンティティ関係を持つプロジェクトに取り組んでいます。関連するオブジェクトが 2 つあります。ユーザーともう一方の X を呼び出しましょう。ユーザーは、X に対して 1 対多 AND 2 つの 1 対 1 の関係を持ちます。基本的には次のようになります。

【利用者実体】

@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実体]

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

新しいユーザーを永続化するとき、1 つのトランザクションで 2 つの x エンティティ (activeX1 用と activeX2 用に 1 つ) も永続化したいと考えています。JPA はこの abit を奇妙に処理します。ログは次のようになります。

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

これにより、データベースで NOT NULL 制約を使用できなくなります。これらの複数の関係を処理するより良い方法はありますか? または、JPA がオブジェクトを永続化する順序を制御する方法はありますか? JPAは、この操作で明示的に私に反対しようとしているようです。どんな助けでも大歓迎です。

4

2 に答える 2

0

EntityManager.flushメソッドを使用して解決し、JPAに最初にユーザーを永続化させます。

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

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

ユーザーのactiveX列でnull値を許可する必要がありますが、少なくともXでnullを強制できないので、それで問題ありません。

于 2010-12-20T08:09:12.580 に答える
0

@NotNull アノテーションを使用しないのはなぜですか? 永続的な順序を変更する方法はないと思います。手動で行う必要があります。このようなもの、

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 );
}
于 2010-12-17T15:18:32.450 に答える