【问题标题】:Hibernate interface mapping without using annotation parameter "targetEntity"不使用注解参数“targetEntity”的休眠接口映射
【发布时间】:2013-03-07 14:19:23
【问题描述】:

我最近尝试为我的一些休眠映射实体引入接口,但不知道如何配置映射。

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

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

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

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

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

那么有没有另一种方法来声明应该使用哪个实现,我可以在提取的库之外使用?

【问题讨论】:

    标签: java hibernate jpa jpa-2.0


    【解决方案1】:

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

    【讨论】:

    • 好主意,技术上。不幸的是,我真的需要接口。抽象超类无法解决问题,因为我需要多重继承才能满足我的需求。用户(参见上面的示例)应该能够实现多个接口。例如,他既是 blogArticles 的作者,也是 cmets 的作者。我没有在上面提到这一点。对不起。
    【解决方案2】:

    我不确定带有休眠注释的事情是如何工作的,但我做了类似here 描述的事情

    请参阅上一篇文章以获得相当详尽的解释。

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

    您需要的是可以在运行时从接口解析实现类的代码,反之亦然,并使用 hibernate tuplizer/instantiator 契约作为扩展点以允许休眠

    (a) 当需要从 DB 填充实体时创建实现实例,并且 (b) 当需要将实体(实现实例)存储到数据库时,定位hibernate映射元数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2019-06-10
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      相关资源
      最近更新 更多