2013-03-07 96 views
7

我最近试图介绍一些我的hibernate映射实体的接口,但无法弄清楚如何配置映射。不使用注释参数的Hibernate接口映射“targetEntity”

当我使用的接口没有任何进一步声明,我总是得到以下异常:

org.hibernate.MappingException: Could not determine type for: ...MyInterface 

然后我发现一切正常,当我明确定义targetEntity:

@OneToOne(targetEntity=InterfaceImpl.class) 
    private MyInterface myInterface; 

不幸的是,这个解决方案在我的情况下不起作用:我不能通过注释来定义targetEntity,因为我想将这个类提取到一个不包含甚至不知道接口的最终实现的公共外部库。

那么是否有另一种方法来声明应该使用哪个实现,以便我可以在提取的库之外使用? enter image description here

回答

1

在抽象@MappedSupperclass中定义您的映射合约,然后在实现类中用@AssociationOverride覆盖它。

+0

好主意,技术上。不幸的是,我真的需要接口。抽象超类不会这样做,因为我需要多继承来使它们适合我的需求。用户(见上面的例子)应该能够实现多个接口。例如,他既是博客文章的作者,也是评论的作者。我没有提到这一点。抱歉。 – Pumuckline 2013-03-11 16:04:48

1

我不知道的东西与Hibernate的注解是如何工作的,但我没有描述here

见最后发表的一个相当详尽的解释类似的东西。

基本的需求是相似的,因为我们在hibernate映射文件中指定了接口,实现是大多数在运行时用javassist创建的类(它们不存在编译时)。

你需要的是代码,可以在运行时解决从接口,反之亦然实现类和使用Hibernate的tuplizer /实例化的合同作为扩展点,以允许Hibernate

(一)创建实施(b)在需要将实体(实现实例)存储到数据库时,定位hibernate映射元数据。