【问题标题】:JPA embeddable entity with composite id具有复合 ID 的 JPA 可嵌入实体
【发布时间】:2014-07-10 07:25:26
【问题描述】:

我认为我有一个相当简单的架构,但我找不到正确的映射方式。

@Entity
class Satellite {
   @Id
   private int id;
   // stuff
   @ElementCollection @OrderBy(value = "orbit asc")
   private List<DataModel> dataModel;
}

可嵌入类如下:

class DataModel {
    private int orbit;
    private int data;
}

问题是,每个卫星的轨道都应该是唯一的。在我看来,代表数据模型的表有一个由卫星 ID 和轨道组成的复合主键。但我找不到正确的映射方式。如果我将 DataModel 声明为普通实体,我必须添加一个映射多方的卫星字段和一个包括卫星和轨道的复合主键,但它不起作用(堆栈溢出!!)。

我使用 hibernate 作为持久性提供程序。

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    如果我将 DataModel 声明为普通实体,我必须添加一个映射多方的卫星字段和一个包含卫星和轨道的复合主键。

    在数据库级别上,无论如何您都必须这样做,即包含DataModel 的表需要卫星的外键。在那种情况下,我没有理由不将DataModel 设为实体:

    @IdClass( DMKeyClass.class )
    @Entity
    class DataModel {
      @Id
      private Satellite sat;
      @Id
      private int orbit;
      private int data;
    }
    
    class DMKeyClass {
      public int sat;
      public int orbit;
    }
    

    【讨论】:

    • @fer.marino 是的,为了简单起见,我将其省略了,但只要您在Satellite 端使用mappedBy 属性(DataModel 将成为该关系的所有者)。
    • 好吧,添加 manytoone 注释会在休眠中创建堆栈溢出。显然,当他解决这种关系时,他陷入了循环。经过简短的搜索后,我使用对该关系的惰性获取来解决它。感谢您的帮助托马斯!
    • 现在发生的另一个奇怪问题是数据模型类的内存泄漏。这些类在算法中使用,出于某种原因,有人(不是我,hibernate?)正在创建大量的数据模型实例,并且没有从无参数构造函数传递。这很奇怪!即使我不使用数据模型,它也会这样做!如果我打破这种关系,问题就会消失,但我当然需要它。
    • @fer.marino 你能发布你的地图吗?
    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2015-03-18
    • 2016-12-17
    • 1970-01-01
    • 2013-02-08
    相关资源
    最近更新 更多