2016-06-19 8 views
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(); 
} 
+0

まあ、同じアテステーションを複数回作成します。どうして? –

+0

私の間違い私はコードをオリジナルに編集しました –

+0

あなたのコードは不明です。アテステーションがどこから来ているのか、そしてサービスが何をしているのかはわかりません。いずれにせよ、最も大きな間違いは、切り離されたオブジェクトを取得してから再接続する代わりに、トランザクションサービスでこのすべてを実行する必要があることです。途中で例外が失敗した場合、作業の半分は完了し、残りの半分は失敗し、データベースは矛盾した状態になります。添付オブジェクトで作業し、コードがトランザクションであることを確認します。コードはよりシンプルになり、速くなります。 –

答えて

2

を私は@GeneratedValue注釈を削除することによって、これを解決しました。それは私のために働いていた他のオプション(自動または身元)がないように見えます。
代わりに、私はテーブルの最大IDを取得し、それを1つ増やして、手動でエンティティに設定します。私はオブジェクトを永続させると完全に動作します。

関連する問題