【问题标题】:Create a list in Hibernate在 Hibernate 中创建一个列表
【发布时间】:2021-09-30 03:12:12
【问题描述】:

我要创建下表:

ITEM_TABLE:

ID | TITLE | STORE1_TITLE | STORE1_PRICE | STORE2_TITLE | STORE2_PRICE

我们可以看到这是一个包含 X 个商店的列表,应该像这样提取到一个单独的表中:

ITEM_TABLE:

ID | TITLE

STORE_ITEM_TABLE:

ITEM_ID | STORE_TITLE | PRICE

问题:我使用哪种方法通过 Hibernate 实现这一目标?

我测试过的:

@Entity
@Table(name = "ITEM_TABLE")
public class Item {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @Column(name = "TITLE")
    private String title;

    @OneToMany(mappedBy = "STORE")
    private List<Store> stores;
}

下一步:

@Entity
@Table(name = "ITEM_STORE_TABLE")
public class Store {
    
    @ManyToOne
    @JoinColumn(name="ITEM_ID", nullable=false)
    private Item item;

    @Column(name = "STORE_TITLE")
    private String title;

    @Column(name = "PRICE")
    private double price;
}

这种方法的问题是 Hibernate 似乎不允许在没有 ID 的情况下创建 ITEM_STORE_TABLE。我看不出它有任何理由和 ID,因为它只是一个属于 ITEM_TABLE 中行的列表,在这个意义上不是一个实际的商店。

我在正确的道路上吗?或者我应该使用@IdClass 并在 STORE_ITEM_TABLE 中使用多个键(感觉不对)?还是应该使用@Embeddable 来处理列表?

欢迎任何反馈!

【问题讨论】:

    标签: hibernate one-to-many hibernate-mapping many-to-one


    【解决方案1】:

    是的,您可以使用@ElementCollection 将列表添加到表中。但由于这很慢,推荐的方法是使用参考@Id,如下所示:

    @Entity
    @Table(name = "ITEM_STORE_TABLE")
    public class Store {
        
        @Id
        @ManyToOne
        @JoinColumn(name="ITEM_ID", nullable=false)
        private Item item;
    
        @Column(name = "STORE_TITLE")
        private String title;
    
        @Column(name = "PRICE")
        private double price;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 2014-03-09
      • 2020-04-20
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多