2017-06-09 41 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应该解决您的问题的复位。