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

标签 java mysql hibernate jpa clob

我确实有两个实体通过 OneToMany-Relation 相互关联。

实体 1 名为“Change”,如下所示

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 添加到“latedChangeTask”列表中来保留新的或现有的 Change 记录,效果非常完美。

现在我必须将 8 个属性的注释从 Default 更改为 @Lob,因此更改现在如下所示:

  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 时,持久操作不会失败。但在事务结束时,关系尚未持久化,这意味着关系表“CHANGE_CHANGETASK”仍为空。当我调试整个过程时,我可以看到列表在“entityManager.merge()”操作之前包含一个条目,并且在合并之后仍然包含一个条目。但它永远不会到达数据库。

有人知道我在这里做错了什么吗?尽管听起来很奇怪,但它一定与 @Lob 注释有关。一旦我再次从实体中删除它们,一切都会正常。

提前致谢。

最佳答案

你写的

public void getAttribute1() {

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

public String getAttribute1() {

此外,您还注释了 setter :

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

您必须对字段或 getter 进行注释。

关于java - 当 VARCHARS 转向 CLOB 时,JPA 持久化不会与关系发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46282777/

相关文章:

java - 如何在Java中从文件中读取特定数量的字节到字节数组中?

php - 为 HTML 编码 mySQL 文本?

php - 将 sql 变量返回给 PHP

java - 关于在java中使用hibernate和注释进行数据库查询的问题

hibernate - Grails hibernate 标准: How do I specify multiple criteria for one association?

java - 如何从 URL 获取最终 URL(浏览器最后将加载的 URL)?

java - 如何检测测试是否在 GitLab CI 服务器上运行

mysql - 从两个 ID 中选择最后两个值

java - @Transactional 和@TransactionAttribute 的区别

java - 尝试将 BLOB 作为 InputStream 读取,但出现连接关闭错误。 Spring3 getJdbcTemplate() 方法