Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 与他人分享一本书的最佳实践是什么?_Jpa_Entity Relationship - Fatal编程技术网

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;
}