gpt4 book ai didi

java - 删除 oneToOne 后 Spring Hibernate TransientPropertyValueException

转载 作者:行者123 更新时间:2023-12-02 11:12:27 25 4
gpt4 key购买 nike

我需要一些帮助来解决 Hibernate TransientPropertyValueException

我们有两个实体:

@Entity
@Table(name = "TABLE_A")
public class TableA {
@Id
@Column(name = "EXT_ID", nullable = false, unique = true, updatable = false)
private String extId;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "EXT_ID", updatable = false, insertable = false)
private TableB tableB;

(...)
}

@Entity
@Table(name = "TABLE_B")
public class TableB {
@Id
@Column(name = "EXT_ID", nullable = false)
private String extId;

@OneToOne
@JoinColumn(name = "EXT_ID")
private TableA tableA;
}

现在我们使用 CrudRepository 删除 TableA:

@Override
@Transactional
public boolean cancel(String extId) {
Optional<TableA> maybeTableA = repository.findTableA(extId, DELETE_STATUS_SET);

return maybeTableA.map(tableA -> {
repository.delete(tableA);
return true;
}).orElse(false);
}

到目前为止,一切正常。但现在每当我想查询引用了 TableATableB 时,我都会收到 TransientPropertyValueException很明显,在提交事务之前,TableBTableA 的引用尚未被删除。

有什么好的方法可以解决这个问题吗?我在删除后直接尝试了 sessionFactory.getCurrentSession().flush() 但它也不起作用

唯一有效的替代方法是手动删除事务中的引用:

tableB.setTableA(null);
tableBRepository.save(tableB);

但是在我看来这有点hacky

最佳答案

当涉及到 JPA 关系时,您有责任更新关系的双方。

此处,cancel 方法应同时更新 tableAtableB。否则,您得到的是 tableB 中的 EXT_ ID 值,该值在 tableA 中没有对应关系。然后,在检索 tableB 实体时,Hibernate 需要一个相应的 tableA 实体,该实体不再存在并抛出错误。

TableB 的 extId 需要可为 null,如果在删除其相应的 tableA 实体时应保留 tableB 实体。

还有一件事:与 TableA 一样,TableB 需要声明 extIdtableA > 为可更新= false,可插入= false。 Hibernate 不喜欢同一个数据库字段上有两个可写属性。

@Override
@Transactional
public boolean cancel(String extId) {
Optional<TableA> maybeTableA = repository.findTableA(extId, DELETE_STATUS_SET);

return maybeTableA.map(tableA -> {

// update tableB
TableB tableB = tableA.getTableB();
tableB.setExtId(null);
tableB.setTableA(null);
tableBRepository.save(tableB);

// and update tableA
repository.delete(tableA);
return true;
}).orElse(false);
}

关于java - 删除 oneToOne 后 Spring Hibernate TransientPropertyValueException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50531356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com