2017-10-19 5 views
0

あらかじめ私の英語を残念に思っています。 エンティティリストに要素を追加しようとしていますが、最初の要素のみがこのリストに残ります。ここでJPAエンティティリストに要素を追加しようとするときに奇妙な動作が発生する:最初の要素のみが残る

例:このデータベースでは、プロジェクトとマシンが(マッピングテーブルを介して)正しくリンクが、テストテーブルにはレコードのみ「テスト0」が含まれている後

Project project = project_facade.find(1L); 
Machine machine = machine_facade.find(1L); 

for(int i=0;i<3;i++){ 
    Test test = new Test(); 
    test.setName("Test "+i); 

    test.setProject(project); 
    test.setMachine(machine); 

    project.getTestList().add(test); 
    machine.getTestList().add(test); 
} 

project.getMachineList().add(machine); 
machine.getProjectList().add(project); 

project_facade.edit(project); 

( project_idフィールドとmachine_idフィールドが正しい)。

それが唯一の最初の要素のための仕事だ、なぜ私は理解していない...

あなたの助けをありがとう!

プロジェクトエンティティ:

@Entity 
public class Project implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "id") 
    private Long id; 

    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 45) 
    @Column(name = "name") 
    private String name; 

    @ManyToMany(mappedBy = "projectList", cascade = CascadeType.ALL) 
    private List<Machine> machineList; 

    @OneToMany(mappedBy = "project", cascade = CascadeType.ALL *SOLUTION : ,fetch = FetchType.EAGER*) 
    private List<Test> testList; 

    //constructor, getters, setters 
} 

マシンエンティティ:

@Entity 
public class Machine implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "id") 
    private Long id; 

    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 45) 
    @Column(name = "name") 
    private String name; 

    @JoinTable(name = "project_machine", joinColumns = { 
     @JoinColumn(name = "machine", referencedColumnName = "id")}, inverseJoinColumns = { 
     @JoinColumn(name = "project", referencedColumnName = "id")}) 
    @ManyToMany 
    private List<Project> projectList; 

    @OneToMany(mappedBy = "machine",cascade = CascadeType.ALL) 
    private List<Test> testList; 

    //constructor, getters, setters 
} 

テストエンティティ:

public void edit(T entity) { 
     getEntityManager().merge(entity); 
    } 

@Entity 
public class Test implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "id") 
    private Long id; 

    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 64) 
    @Column(name = "name") 
    private String name; 

    @JoinColumn(name = "project", referencedColumnName = "id") 
    @ManyToOne(optional = false) 
    private Project project; 

    @JoinColumn(name = "machine", referencedColumnName = "id") 
    @ManyToOne(optional = false) 
    private Machine machine; 

    //constructor, getters, setters 
} 

そして、すべて私のファサードが編集方法があるAbstractFacadeを拡張

+0

'project_facade.edit()の実装と同様に、両方のエンティティを表示してください – crizzis

+0

もちろん、' getTestList() 'の実装は – Nep

+0

ですか?最初の要素は実際には 'Test 0'ですか? – pirho

答えて

0

私は答えを見つけました!!!!!プロジェクトエンティティのOneToManyアノテーションに "fetch = FetchType.EAGER"を追加しました!

関連する問題