2017-06-09 44 views
3

我有一個休眠實體類爲什麼是一對多的關係堅持多行數據庫

public class MyComplexClass implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    Long id; 

    String name; 
    int number; 
    @ElementCollection 
    Map<String,String> myMap; 

    @ManyToOne 
    Simple simple; 

    public MyComplexClass(String name, int number, Map<String,String> myMap) { 
     this.name = name; 
     this.port = number; 
     this.myMap = myMap; 
    } 

    public MyComplexClass() { 
     // TODO Auto-generated constructor stub 
    } 

    public void setName(String name) { 
     this.name = name; 

    } 

    public String getName() { 
     return name; 
    } 

    public void setNumber(int number) { 
     this.port = number; 
    } 

    public int getPort() { 
     return port; 
    } 

    public void setMyMap(Map<String,String> myMap) { 
     this.myMap = myMap; 
    } 

    public Map<String,String> getMyMap() { 
     return this.myMap; 
    } 


    public Simple getSimple() { 
     return this.simple; 
    } 

而在類簡單的我有以下形式的映射

@Entity 
    @Table(name = "Simple") 


    public class Simple implements Comparable<Simple>, Serializable { 
    @JsonProperty 
    @OneToMany(mappedBy="simple",fetch = FetchType.EAGER,cascade = CascadeType.ALL) 
    Set<MyComplexClass> myComplexClass; 

    public void setMyComplexClass(List<MyComplexClass> myComplexClass) { 
     this.myComplexClass = myComplexClass; 
    } 

    public List<MyComplexClass> getMyComplexClass() { 
     return this.myComplexClass; 
    } 

某處在系統我將值設置爲

Map<String, String> myMap = new HashMap<String,String>(); 
myMap.put("value","value"); 
MyComplexClass myComplexClass = new MyComplexclass("a", 123, myMap) 
Set<MyComplexClass> myComplexClassList = new HashSet<MyComplexClass>(); 
myComplexClassList.add(myComplexClassList) 
simple.setMyComplexClass(myComplexClassList); 
myComplexClass.setSimple(simple); 
// save to the database 
dao.save(simple); 

這會在我的複雜類中使用多行持續存在數據庫中與簡單類別相同的外鍵

Table: MyComplexClass 
    id name number simple_id 
    1 abc 234 1 
    2 abc 234 1 
    3 abc 234 1 
    4 abc 234 1 
    5 abc 234 1 
    6 xyz 432 2 
    7 xyz 432 2 
    8 xyz 432 2 

我錯過了什麼?所有這些行的id是不同的,這讓我認爲他們已經在代碼中被多次初始化了。但他們不是。任何原因他們有不同的條目?我正在使用AKKA演員,這可能是一個原因嗎?

基於各種類似的問題。我已經改變了收藏是一個集和還增加了一個compareTo方法如下

public int compareTo(MyComplexClass o) { 
     if (o == null) { 
      return 1; 
     } 

     if (this.getName().equals(o.getName()) && this.getNumber() == o.getPort()) { 
      return 0; 
     } 
     return (int) (id - o.id); 
    } 
+0

'ElementCollection'應該被保存到一個單獨的(連接)表中,每個鍵/值對具有多行...一個。我沒有看到它在'MyComplexClass'表,所以不知道你是什麼意思 –

+0

是的,你是對的,它堅持作爲一個單獨的表。但我的問題是關於List ,它是Simple類中的元素集合。這些創建各種重複的行。不知道爲什麼 –

+0

A'@ OneToMany'不是'@ ElementCollection'! '@ ElementCollection'是基本類型的容器,像以前一樣 –

回答

0

我投來關閉這個例子不能編譯,如果我能是不完整的,但由於它具有一個賞金我不能。你引用了一個dao對象,你不包括它的源代碼。你打電話給doa.save,這是一個春季問題嗎?否則,你的實體沒有任何問題,它對我來說一切正常。

public class JPAExample {  
    public static void main(String[] args) { 
     EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistence"); 
     EntityManager em = emf.createEntityManager(); 
     try { 
      EntityTransaction tx = em.getTransaction(); 
      tx.begin(); 
      Simple simple = new Simple(); 
      Map<String, String> myMap = new HashMap<String,String>(); 
      myMap.put("value","value"); 
      MyComplexClass myComplexClass = new MyComplexClass("a", 123, myMap); 
      Set<MyComplexClass> myComplexClassList = new HashSet<MyComplexClass>(); 
      myComplexClassList.add(myComplexClass); 
      simple.setMyComplexClass(myComplexClassList); 
      myComplexClass.setSimple(simple); 
      // save to the database 
      em.persist(simple); 
      tx.commit(); 
     } finally { 
      emf.close(); 
     } 
    } 
} 

Simple.class

@Entity 
@Table(name = "Simple") 
public class Simple implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; 
    // @JsonProperty 
    @OneToMany(mappedBy = "simple", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    Set<MyComplexClass> myComplexClass; 
    public void setMyComplexClass(Set<MyComplexClass> myComplexClass) { 
     this.myComplexClass = myComplexClass; 
    } 
    public Set<MyComplexClass> getMyComplexClass() { 
     return this.myComplexClass; 
    } 
} 

MyComplexClass

@Entity 
@Table(name="MyComplexClass") 
public class MyComplexClass implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; 
    String name; 
    int number; 
    @ElementCollection 
    Map<String,String> myMap; 
    @ManyToOne 
    Simple simple; 
    public MyComplexClass(String name, int number, Map<String,String> myMap) { 
     this.name = name; 
     this.myMap = myMap; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setMyMap(Map<String,String> myMap) { 
     this.myMap = myMap; 
    } 
    public Map<String,String> getMyMap() { 
     return this.myMap; 
    } 
    public Simple getSimple() { 
     return this.simple; 
    } 
    public void setSimple(Simple simple) { 
     this.simple = simple; 
    } 
} 

產生下面的輸出...

Hibernate: create table MyComplexClass (id bigint generated by default as identity (start with 1), name varchar(255), number integer not null, simple_id bigint, primary key (id)) 
Hibernate: create table MyComplexClass_myMap (MyComplexClass_id bigint not null, myMap varchar(255), myMap_KEY varchar(255), primary key (MyComplexClass_id, myMap_KEY)) 
Hibernate: create table Simple (id bigint generated by default as identity (start with 1), primary key (id)) 
Hibernate: alter table MyComplexClass add constraint FK_qlkwvh7xyrn3udhnrn40fl6f8 foreign key (simple_id) references Simple 
Hibernate: alter table MyComplexClass_myMap add constraint FK_qp5xa90y7pk94lb64kvt62589 foreign key (MyComplexClass_id) references MyComplexClass 
Jun 12, 2017 10:06:56 AM org.hibernate.tool.hbm2ddl.SchemaExport execute 
INFO: HHH000230: Schema export complete 
Hibernate: insert into Simple (id) values (default) 
Hibernate: insert into MyComplexClass (id, name, number, simple_id) values (default, ?, ?, ?) 
Hibernate: insert into MyComplexClass_myMap (MyComplexClass_id, myMap_KEY, myMap) values (?, ?, ?) 
Jun 12, 2017 10:06:56 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop 
INFO: HHH000030: Cleaning up connection pool [jdbc:hsqldb:mem:standalone] 

哪隻顯示一個插入MyComplexClass錶行。

您可以複製此代碼並使用它來找出您的代碼出了什麼問題。

0

由於您使用的是基於Hash集合Set,您必須在MyComplexClass實體覆蓋equalshashcode

docs

你必須重載equals()和hashCode()方法,如果你: 想把持久類的實例放入Set(推薦的方式來表示多值關聯);和 打算使用分離的情況下

重寫equalshashcode應該解決您的問題的復位。