Glassfish ContainerでJPAを使用しています。私は次のモデル(完全ではない)を持っていますJPAコレクションでエンティティを更新するベストプラクティス
@Entity
public class Node {
@Id
private String serial;
@Version
@Column(updatable=false)
protected Integer version;
private String name;
@ManyToMany(cascade = {CascadeType.PERSIST,CascadeType.MERGE})
private Set<LUN> luns = new HashSet<LUN>();
@Entity
public class LUN {
@Id
private String wwid;
@Version
@Column(updatable=false)
protected Integer version;
private String vendor;
private String model;
private Long capacity;
@ManyToMany(mappedBy = "luns")
private Set<Node> nodes = new HashSet<Node>();
この情報は毎日更新されます。今私の質問は、これを行うベストプラクティスは何ですか。
私のアプローチは、毎日新しいものをクライアント上で(LUNを使用して)ノードオブジェクトを生成し、それをデータベースにマージします(私はJPAに仕事をさせたいと思っていました)。
今、私はLUNなしでいくつかのテストを行った。
public void updateNode(Node node) {
if (!nodeInDB(node)) {
LOGGER.log(Level.INFO, "persisting node {0} the first time", node.toString());
em.persist(node);
} else {
LOGGER.log(Level.INFO, "merging node {0}", node.toString());
node = em.merge(node);
}
}
テスト:
@Test
public void addTest() throws Exception {
Node node = new Node();
node.setName("hostname");
node.setSerial("serial");
nodeManager.updateNode(node);
nodeManager.updateNode(node);
node.setName("newhostname");
nodeManager.updateNode(node);
}
これは@Versionフィールドなしで動作し、私はステートレスEJBの以下のサービスを提供しています。 @Versionフィールドでは、私はOptimisticLockExceptionを取得します。
これは間違ったアプローチですか?常にem.find(...)を実行してから、getterとsetterで管理対象エンティティを変更する必要がありますか?
何か助けていただければ幸いです。
BR Rene
私はそれを理解していません。私はまだランチを追加していませんでした。 – reen
申し訳ありませんが、私は明らかに十分に読んでいませんでした。私はあなたの答えを変えました。 – weltraumpirat
ありがとうございました。そのシナリオでバージョン管理を完全に削除することを提案していますか?クライアントソフトウェアは、一度に1つのノードだけが更新されることを保証する必要があります。 – reen