当VARCHARS转向CLOB时,JPA持久化不会发生关系

时间:2017-09-18 15:13:33

标签: java mysql hibernate jpa clob

我确实有两个通过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注释相关的东西。一旦我从实体中再次删除它们,一切正常。

提前致谢。

1 个答案:

答案 0 :(得分:1)

你写了

public void getAttribute1() {

这不可能是正确的。我想你的意思是

public String getAttribute1() {

此外,您已注释了setter:

@Column(name="\"ATTRIBUTE1\"")
public void setAttribute1(String attribute1) {
  this.attribute1 = attribute1;
}

您必须注释字段或getter。