我希望Hibernate只为我构建一个包含此列的表:
id | product_id | enum_id
1 1 1
2 1 2
即。每个产品都可以有很多枚举。我不想引入新的链接表。
所以我的问题是如何注释我的字段以实现这样的表结构。
到目前为止,我有这个实体:
@Entity
public class Entity {
@Id
private Long id;
@ManyToOne( fetch = FetchType.LAZY )
@JoinColumn( name = "product_id" )
private Product product;
@ElementCollection
@??? // what should go here?
private List<Enum> enums = new Arralist<>();
}
答案 0 :(得分:1)
您建议的表格将具有一个产品,并且每个Entity
实例具有一个枚举。这与您的注释无关,但实际上实体将始终为每一行生成一个新实例,因为每一行都有自己的ID。
如果删除ID列,则给定的表已经是您的链接表,您只需要注释Product
实体:
@Entity
public class Product {
// ...
@ElementCollection
@Enumerated
private Set<MyEnum> enums;
}
您需要在我的示例Enum
中声明MyEnum
的类型,因为您无法绑定到任何Enum
(Hibernate不知道要实例化哪一个)从数据库中读取时。)
如果您想坚持使用任何现有的表名或列名,可以使用额外的@CollectionTable
。但我建议使用默认值,因为它使代码更容易阅读。
如果您真的像第一次尝试一样,需要一个枚举列表(允许重复并存储项目的顺序),而不是列表中需要一个额外的索引列。您可以通过以下方式实现此目的:
@ElementCollection
@Enumerated
@OrderColumn
private List<MyEnum> enums;
答案 1 :(得分:0)
我可以看到你会添加多行不同的值,所以为什么不这样:
@ElementCollection
@CollectionTable(name="the_table_name", joinColumns=@JoinColumn(name="product_id")) @Column(name="product_id")
private Enum enum;
然后您可以在多行中添加连接到product_id的多个枚举。如果您希望每个产品只有一个位置,那么您可以使用@StanislavL提到的方法:
QString text = xmlReader.readElementText(QXmlStreamReader::IncludeChildElements);