我确实有两个通过OneToMany-Relation相互关联的实体。
实体1名为“更改”,如下所示
public class Change {
String attribute1;
@Column(name="\"ATTRIBUTE1\"")
public void getAttribute1() {
return this.attribute1;
}
public void setAttribute1(String attribute1) {
this.attribute1 = attribute1;
}
// and 7 more of these....
List<ChangeTask> relatedChangeTasks = new ArrayList<ChangeTask>();
@OneToMany(cascade={PERSIST, MERGE, REFRESH}
@JoinTable(name="CHANGE_CHANGETASK", joinColumns={@JoinColumn(name="CHANGE_ID")}, inverseJoinColumns={@JoinColumn(name="CHANGETASK_ID")})
@JoinColumn(name="\"relatedChangeTask_ID\"" )
public List<ChangeTask> getRelatedChangeTasks() {
return this.relatedChangeTasks;
}
public void setRelatedChangeTasks(List<ChangeTask> relatedChangeTasks) {
this.relatedChangeTasks = relatedChangeTasks;
}
}
实体2名为ChangeTask并扩展了Change。
public class ChangeTask extends Change {
// some additional attributes...
}
通过将一个ChangeTask添加到“relatedChangeTask”列表中来保留新的或现有的更改记录非常完美。
现在我必须将8个属性的注释从Default更改为@Lob,因此Change现在看起来像这样:
public class Change {
String attribute1;
@Lob
@Column(name="\"ATTRIBUTE1\"")
@Basic(fetch=EAGER)
public String getAttribute1() {
if(fieldHandler != null) {
return (java.lang.String) fieldHandler.readObject(this, "attribute1", attribute1);
}
return attribute1;
}
public void setAttribute1(String attribute1) {
if(fieldHandler != null) {
this.attribute1= (java.lang.String) fieldHandler.writeObject(this, "attribute1", this.attribute1, attribute1);
return;
}
this.attribute1= attribute1;
}
// and 7 more of these....
List<ChangeTask> relatedChangeTasks = new ArrayList<ChangeTask>();
@OneToMany(cascade={PERSIST, MERGE, REFRESH}
@JoinTable(name="CHANGE_CHANGETASK", joinColumns={@JoinColumn(name="CHANGE_ID")}, inverseJoinColumns={@JoinColumn(name="CHANGETASK_ID")})
@JoinColumn(name="\"relatedChangeTask_ID\"" )
public List<ChangeTask> getRelatedChangeTasks() {
return this.relatedChangeTasks;
}
public void setRelatedChangeTasks(List<ChangeTask> relatedChangeTasks) {
this.relatedChangeTasks = relatedChangeTasks;
}
}
现在,当我尝试将一个给定的ChangeTask添加到Change时,persist操作不会失败。但在事务结束时,关系尚未持久化,这意味着关系表“CHANGE_CHANGETASK”仍为空。当我调试整个过程时,我可以看到列表在“entityManager.merge()”操作之前包含一个条目,并且在合并之后它仍然包含一个条目。但它永远不会到达数据库。
有人知道我在这里做错了什么吗?听起来很奇怪,它必须是与@Lob注释相关的东西。一旦我从实体中再次删除它们,一切正常。
提前致谢。
答案 0 :(得分:1)
你写了
public void getAttribute1() {
这不可能是正确的。我想你的意思是
public String getAttribute1() {
此外,您已注释了setter:
@Column(name="\"ATTRIBUTE1\"")
public void setAttribute1(String attribute1) {
this.attribute1 = attribute1;
}
您必须注释字段或getter。