2
永続するために渡された分離されたエンティティは、私の人生を地獄に変えました、この問題を抱えてから2日間でした。 私は2つのテーブル "モジュール"と "アテステーション"を持って、私はモジュールのタイトルのリストを持っていると私は何をしているタイトルを取って、モジュールを取得し、 。jpa hibernate:永続化するために渡された独立したエンティティ
クラッセアテステーション:
@Entity
@Table(name = "edep_attestations")
public class Attestation implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String title;
...
@ManyToMany(mappedBy="attestations")
private Set<Module> modules = new HashSet<>();
// getters and setters
}
クラッセモジュール:
@Entity
@Table(name = "edep_modules")
public class Module implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
private String title;
...
@ManyToMany(fetch = FetchType.EAGER,cascade = {CascadeType.MERGE})
private Set<Attestation> attestations = new HashSet<>();
// getters and setters
}
、これは私の例では 私はので、私は次のクラスの論文を持つ多対多の関係
を使用しています私の豆で使っている方法
public String create(){
Module m = null;
this.attestationsService.create(attestation);
for (String title : moduleTitles) {
m = modulesService.getModulebyTitle(title);
m.getAttestation().add(attestation);
this.modulesService.create(m);
}
return "success";
}
クラスmodulesService、メソッドの作成:
public void create(E object) throws Exception {
em.clear();
em.persist(object);
em.flush();
}
まあ、同じアテステーションを複数回作成します。どうして? –
私の間違い私はコードをオリジナルに編集しました –
あなたのコードは不明です。アテステーションがどこから来ているのか、そしてサービスが何をしているのかはわかりません。いずれにせよ、最も大きな間違いは、切り離されたオブジェクトを取得してから再接続する代わりに、トランザクションサービスでこのすべてを実行する必要があることです。途中で例外が失敗した場合、作業の半分は完了し、残りの半分は失敗し、データベースは矛盾した状態になります。添付オブジェクトで作業し、コードがトランザクションであることを確認します。コードはよりシンプルになり、速くなります。 –