【发布时间】:2013-11-05 12:35:51
【问题描述】:
我有一个实体 (Layer),它映射了其他实体 (Member) 的列表。此列表可能没有条目/为null。然而,当我查询实体时,我从数据库中得到一个NOT NULL check constraint 错误。
它似乎连接到NamedQueries,因为如果我通过id 查询,我可以从数据库中读取实体。
@Entity
@NamedQueries({
@NamedQuery(name="getChildLayers",-
query = "SELECT la
FROM Layer la
WHERE la.parent = :parent AND la.deletedDate IS NULL")})
public class Layer extends CommonModel {
/*... other field */
@ManyToOne(fetch = FetchType.LAZY, targetEntity = Layer.class, optional = true)
private Layer parent;
@ManyToMany(fetch = FetchType.LAZY, targetEntity = MyUser.class)
private List<MyUser> members;
public List<MyUser> getMembers() {
return members;
}
public void setMembers(List<MyUser> members) {
this.members = members;
}
/*... other getters and setters */
}
我收到此错误:integrity constraint violation: NOT NULL check constraint; SYS_CT_10298 table: LAYER_MYUSER column: MEMBERS_ID
不过,我可以创建条目。
当我运行测试时,所有读取实体的测试都失败(但创建工作)。如果我在创建方法中添加以下行:
layer.setMembers(new ArrayList<MyUser>());
然后测试成员交替的方法起作用(意思是,我可以创建一个Layer 并通过在列表中添加和删除元素来更改它的members)。
在我看来,只要Layer 没有Member,从数据库中读取实体就会失败。
我确实尝试将 @JoinColumn(nullable=true) 添加到该字段,但它没有任何改变。
我导入 javax.persistence 类。
关于如何访问变量的示例(在 LayerService 中)
// this method works as expected
public Layer getById(Long id) {
Session s = sessionFactory.getCurrentSession();
return (Layer)s.get(Layer.class, id);
}
// this does not.
public List<Layer> getChildren(Layer layer) {
Query childrenQuery = sessionFactory.getCurrentSession().getNamedQuery("getChildLayers");
childrenQuery.setParameter("parent", layer);
return (List<Layer>) childrenQuery.list();
}
Jason Cs 回答后代码更改:
Layer
...
private final List<OCWUser> members = new ArrayList<>();
...
public void setMembers(List<OCWUser> members) {
this.members.clear();
this.members.addAll(members);
}
问题依然存在。
【问题讨论】:
-
您是否手动创建表?
-
@frostjogla 不,表格是自动创建的。
-
Hibernate 使用列“MEMBERS_ID BIGINT NOT NULL”和“MYUSER_ID BIGINT NOT NULL”docs.jboss.org/hibernate/orm/3.3/reference/en/html/… 创建“LAYER_MYUSER”表。尝试从列中手动删除“非空”约束。
-
@frostjogla 我宁愿不必手动修改数据库。必须有不同的方式。
标签: java hibernate jpa many-to-many hsqldb