[英]Hibernate schema generation bug with multiple maps and same value type?
Hibernate(核心{4.2.7.SP5-redhat-1},使用方言PostgreSQL82Dialect)正在生成一个我不了解的模式,当我认为不应该使用时,它就会失败。 我得到的例外是
ERROR: ERROR: null value in column "aggregategroupmap_id" violates not-null constraint
Detail: Failing row contains (1, 2, BILLPROGRESS, null, null).
这是正确的,因为我没有尝试在另一列中插入任何内容。 我认为我不必这样做,因为这些列引用了两个不同的地图。
这是我的主要MyClass课。
import java.io.Serializable;
import java.util.*;
import javax.persistence.*;
@SuppressWarnings("serial")
@Entity public class MyClass implements Serializable {
@Id @GeneratedValue private Long id;
@OneToMany(cascade={CascadeType.ALL})
private Map<String, GroupInfo> aggregateGroupMap;
@OneToMany(cascade={CascadeType.ALL})
private Map<String, GroupInfo> computationGroupMap;
public MyClass() {
aggregateGroupMap = new TreeMap<String, GroupInfo>();
computationGroupMap = new TreeMap<String, GroupInfo>();
}
public Map<String, GroupInfo> getAggregateGroupMap() {
return aggregateGroupMap;
}
public Map<String, GroupInfo> getComputationGroupMap() {
return computationGroupMap;
}
}
这是第二类,由第一类引用。
import java.io.Serializable;
import java.util.*;
import javax.persistence.*;
@SuppressWarnings("serial")
@Entity public class GroupInfo implements Serializable {
@Id @GeneratedValue private Long id;
@ElementCollection
@OrderColumn
private List<String> groupLabels;
@ElementCollection
@OrderColumn
private List<String> groupDescriptions;
public GroupInfo() {
groupLabels = new ArrayList<String>();
groupDescriptions = new ArrayList<String>();
}
public List<String> getGroupLabels() {
return groupLabels;
}
public List<String> getGroupDescriptions() {
return groupDescriptions;
}
}
此类尝试持久化对象:
import java.util.*;
import javax.persistence.*;
public class TestIt {
public static void main(String... args) throws Exception {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JpaTest");
EntityManager em = emf.createEntityManager();
MyClass myClass = new MyClass();
GroupInfo groupInfo = new GroupInfo();
groupInfo.getGroupLabels().addAll(new ArrayList<String>(Arrays.asList(new String[] {"SKEWNESS"})));
myClass.getComputationGroupMap().put("BILLPROGRESS", groupInfo);
EntityTransaction tx = em.getTransaction();
tx.begin();
em.persist(myClass);
tx.commit();
em.close();
}
}
据我所知,这是问题表:
create table MyClass_GroupInfo (
MyClass_id int8 not null,
computationGroupMap_id int8 not null,
computationGroupMap_KEY varchar(255),
aggregateGroupMap_id int8 not null,
aggregateGroupMap_KEY varchar(255),
primary key (MyClass_id, aggregateGroupMap_KEY)
);
我尝试添加@Column(nullable = true),但没有任何区别。 有什么建议么?
尝试添加@JoinColumn
属性,
@OneToMany(cascade={CascadeType.ALL})
@JoinColumn(name = "aggregateGroupMapId", nullable = true)
private Map<String, GroupInfo> aggregateGroupMap;
@OneToMany(cascade={CascadeType.ALL})
@JoinColumn(name = "computationGroupMapId", nullable = true)
private Map<String, GroupInfo> computationGroupMap;
另外,您还应该查看有关Google地图的休眠文档 。 也许在那里,您会发现一些更适合您的问题的东西。
@JoinTable(name="")
做到了。
@OneToMany(cascade={CascadeType.ALL})
@JoinTable(name="session_aggregategroupmap")
private Map<String, GroupInfo> aggregateGroupMap;
@OneToMany(cascade={CascadeType.ALL})
@JoinTable(name="session_computationgroupmap")
private Map<String, GroupInfo> computationGroupMap;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.