Jpa 与他人分享一本书的最佳实践是什么?
假设我有一张这样的桌子Jpa 与他人分享一本书的最佳实践是什么?,jpa,entity-relationship,Jpa,Entity Relationship,假设我有一张这样的桌子 K VARCHAR PK V VARCHAR 它只是一个表,存储键和值的条目 现在,我希望它可以用于其他实体 实体A有多个属性,实体B可以有多个属性 @Entity class Property { String key; String value; } 将属性实体共享给其他实体的最佳做法是什么 @Entity class Some { @OneToMany private List<...Property> prope
K VARCHAR PK
V VARCHAR
它只是一个表,存储键和值的条目
现在,我希望它可以用于其他实体
实体A有多个属性,实体B可以有多个属性
@Entity
class Property {
String key;
String value;
}
将属性
实体共享给其他实体的最佳做法是什么
@Entity
class Some {
@OneToMany
private List<...Property> properties;
}
@Entity
class SomeOther {
@OneToMany
private List<...Property> properties;
}
我知道我可以扩展它
@Entity
@DiscriminatorValue("SomeOther")
class SomeProperty extends Property {
}
@Entity
@DiscriminatorValue("SomeOther")
class SomeOtherProperty extends Property {
}
现在我的桌子应该是什么样子
我应该创建一些属性表吗
或者我应该在
属性表中添加一些ID
?我个人会尽量简单一些
当前映射,即:
@Entity
class Some {
@OneToMany
private List<Property> properties;
}
您将在属性
中得到一个外键,该外键指向某些
(对某些
重复使用此映射将产生另一个外键)。使用InheritanceType.SINGLE\u TABLE
可以得到几乎相同的结果
在这里使用继承只会使事情复杂化。我会选择上面的一个选项,或者使用更简单的映射:
@Entity
public class Some {
@ElementCollection
@MapKeyColumn(name = "K")
@Column(name = "V")
@CollectionTable(name = "PROPERTY", joinColumns = @JoinColumn(name = "some_id"))
private Map<String, String> properties;
}
@实体
公开课{
@元素集合
@MapKeyColumn(name=“K”)
@列(name=“V”)
@CollectionTable(name=“PROPERTY”,joinColumns=@JoinColumn(name=“some\u id”))
私人地图财产;
}
上面将属性表示为一个映射
,这就是它们真正的含义。唯一的缺点是,当您重用此映射时(仅更改联接列名,例如,some\u other\u id
),您的JPA提供商可能难以生成模式。当然,您可以决定将不同实体的属性分开,在这种情况下,您可以更改集合表的名称(然后您将获得相当于继承.table\u PER\u CLASS
)
顺便说一句,我不认为将K
作为主键是有意义的,因为假设在Some
的不同实例中会重复这些键。如果您决定使用@OneToMany
的一种解决方案,我建议将代理键(一个@Id@GeneratedValue Long Id
字段)添加到属性
实体中
@Entity
class Some {
@OneToMany
@JoinColumn
private List<Property> properties;
}
@Entity
public class Some {
@ElementCollection
@MapKeyColumn(name = "K")
@Column(name = "V")
@CollectionTable(name = "PROPERTY", joinColumns = @JoinColumn(name = "some_id"))
private Map<String, String> properties;
}