【发布时间】:2014-04-15 09:25:48
【问题描述】:
我在 Java Hibernate 项目中有以下类:
@Entitiy
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class ClassA<T extends ClassB>{
@OneToOne
@JoinColumn(name = "mycolumn_id")
private T instance;
[...]
}
@Entitiy
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class ClassB{
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Integer id;
[...]
}
当我尝试创建/保存 ClassA 的实例(具有继承 ClassB 的类的实例)时,出现以下异常:
org.hibernate.AnnotationException: Property ClassA.instance has an unbound type and no explicit target entity. Resolve this Generic usage issue or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type
我无法在 ClassA 中将显式目标设置为“T 实例”,因为 ClassB 是抽象的并且文字“T.class”无效。但是通用用法是必要的,因为我必须在 ClassA 中保存许多不同类型的 ClassB。
我该如何解决这个问题?
【问题讨论】:
-
为什么不能使用
targetEntity=ClassB.class?仅仅是因为 ClassB 是抽象的吗?你可以让 ClassB 具体化,并防止使用受保护的构造函数直接实例化吗? -
我可以使用“targetEntity=ClassB.class”,但这会让我在运行时出现“无法实例化 ClassB”的异常。 Hibernate 尝试实例化 ClassB 而不是具体的类,这有点令人困惑。所以如果我用受保护的构造函数尝试它没有区别。
-
我必须纠正我。 ClassB 的抽象构造函数不会导致异常。但这并不能解决我的问题,因为它会创建一个 ClassB 而不是具体类的条目。
-
在您的情况下,hibernate 如何创建外键?我认为你不能在休眠中进行“动态”映射(如果我错了,请纠正我)。也许如果您将 ClassB 继承设置为 SingleTable,那么休眠将知道 ClassA 与哪个表相关并为其创建外键。