Hibernate 尝试在 saveOrUpdate 方法中删除不存在的 table 中的行
Hibernate tries to delete rows in a non-existing table in saveOrUpdate method
我有以下实体 classes:
A 类、B 类和 C 类。 ClassC 扩展了 ClassB,后者扩展了 ClassA。
还有另一个名为 ClassWithALongName 的实体 class。
ClassA 与 ClassWithALongName 是多对一的关系,定义如下:
public class ClassWithALongName {
@ManyToOne
@OnDelete(action = OnDeleteAction.CASCADE)
private ClassA myClassA;
// getter-setter of myClassA
}
假设 aClassC 是一个 ClassC 实例,下面的行是 运行:
org.hibernate.Session session = (Session)getEntityManager().getDelegate();
session.saveOrUpdate(aClassC);
session.flush();
在此之后,预期的 ClassA、ClassB 和 ClassC 的三个更新语句是 运行。
我没想到 table 上的删除语句并不存在:
delete from ClassA_ClassWithALongName where ClassA_id=?
最后一条语句导致异常,因为实际的 classes 有更长的名字,所以临时标识符 ClassA_ClassWithALongName 实际上有更多的字符。因为 Oracle 数据库阻止 table 的名称超过 30 个字符,它会抛出异常。
我不明白两件事。
为什么只有更新语句是 运行 时才需要删除?
为什么休眠会创建这样一个与数据库中的 table 不匹配的临时标识符。
感谢任何提示。
作为对 Justas 评论的回答,例外情况是:
java.sql.SQLSyntaxErrorException: ORA-00972: identifier is too long
Essex Boy 的回答帮我解决了问题。实体非常复杂,有人添加了一个我没有注意到的具有一对多关联的列表。我仍然不明白为什么在更新期间需要删除语句,但我暂时保留它:)
ClassA_ClassWithALongName 是 hibernate 期望的连接 table
我认为你在某个地方有@OneToMany 关系。
为了防止连接 table 你需要像这样的东西:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="DICTIONARY_ID")
我有以下实体 classes:
A 类、B 类和 C 类。 ClassC 扩展了 ClassB,后者扩展了 ClassA。
还有另一个名为 ClassWithALongName 的实体 class。
ClassA 与 ClassWithALongName 是多对一的关系,定义如下:
public class ClassWithALongName {
@ManyToOne
@OnDelete(action = OnDeleteAction.CASCADE)
private ClassA myClassA;
// getter-setter of myClassA
}
假设 aClassC 是一个 ClassC 实例,下面的行是 运行:
org.hibernate.Session session = (Session)getEntityManager().getDelegate();
session.saveOrUpdate(aClassC);
session.flush();
在此之后,预期的 ClassA、ClassB 和 ClassC 的三个更新语句是 运行。
我没想到 table 上的删除语句并不存在:
delete from ClassA_ClassWithALongName where ClassA_id=?
最后一条语句导致异常,因为实际的 classes 有更长的名字,所以临时标识符 ClassA_ClassWithALongName 实际上有更多的字符。因为 Oracle 数据库阻止 table 的名称超过 30 个字符,它会抛出异常。
我不明白两件事。 为什么只有更新语句是 运行 时才需要删除? 为什么休眠会创建这样一个与数据库中的 table 不匹配的临时标识符。
感谢任何提示。
作为对 Justas 评论的回答,例外情况是:
java.sql.SQLSyntaxErrorException: ORA-00972: identifier is too long
Essex Boy 的回答帮我解决了问题。实体非常复杂,有人添加了一个我没有注意到的具有一对多关联的列表。我仍然不明白为什么在更新期间需要删除语句,但我暂时保留它:)
ClassA_ClassWithALongName 是 hibernate 期望的连接 table
我认为你在某个地方有@OneToMany 关系。
为了防止连接 table 你需要像这样的东西:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="DICTIONARY_ID")