我有一个实体 ( 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
在我看来,只要Member
没有Layer
.
我确实尝试添加@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);
}
问题依然存在。