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")