我最近试图为我的一些hibernate映射实体引入接口,但无法弄清楚如何配置映射。
当我在没有任何进一步声明的情况下使用接口时,我总是得到以下异常:
org.hibernate.MappingException: Could not determine type for: ...MyInterface
然后当我明确定义targetEntity时,我发现一切正常:
@OneToOne(targetEntity=InterfaceImpl.class)
private MyInterface myInterface;
不幸的是,这个解决方案在我的情况下不起作用:我无法通过注释定义targetEntity,因为我想将这个类提取到一个不包含甚至不知道接口的最终实现的公共外部库。 / p>
那么是否有另一种方法来声明应该使用哪个实现,我可以在提取的库之外使用?
答案 0 :(得分:1)
在抽象@MappedSupperclass
中定义映射契约,然后在实现类中使用@AssociationOverride
覆盖它。
答案 1 :(得分:1)
我不确定hibernate注释的工作原理,但我做了类似的描述here
请参阅上一篇文章,以获得非常详尽的解释。
基本需求类似于我们在hibernate映射文件中指定接口,而实现是主要在运行时使用javassist创建的类(它们不存在编译时)。
你需要的是能够在运行时从接口解析实现类的代码,反之亦然,并使用hibernate tuplizer / instantiator契约作为扩展点来允许hibernate
(a)在需要从DB填充实体时创建实现实例 (b)在需要将实体(实现实例)存储到数据库时找到hibernate映射元数据。