没有ID的JPA实体

2021/01/17 02:11 · java ·  · 0评论

我有一个具有以下结构的数据库:

CREATE TABLE entity (
    id SERIAL,
    name VARCHAR(255),
    PRIMARY KEY (id)
);

CREATE TABLE entity_property (
    entity_id SERIAL,
    name VARCHAR(255),
    value TEXT
);

当我尝试创建EntityProperty类时

@Entity
@Table(name="entity_property")
public class EntityProperty {

    private String name;
    private String value;

    @Column(name="name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Column(name="value", nullable=true, length=255)
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}

我得到以下异常:

org.hibernate.AnnotationException: No identifier specified for entity: package.EntityProperty

我知道JPA实体必须具有主键,但是由于无法控制的原因,我无法更改数据库架构。是否可以创建将与这样的数据库模式一起工作的JPA(休眠)实体?

我猜您entity_property有一个组合键(entity_id, name),其中entity_id的外键是entity如果是这样,则可以按如下所示进行映射:

@Embeddable
public class EntityPropertyPK {
    @Column(name = "name")
    private String name;

    @ManyToOne
    @JoinColumn(name = "entity_id")
    private Entity entity;

    ...
}

@Entity 
@Table(name="entity_property") 
public class EntityProperty { 
    @EmbeddedId
    private EntityPropertyPK id;

    @Column(name = "value")
    private String value; 

    ...
}

我知道JPA实体必须具有主键,但是由于无法控制的原因,我无法更改数据库结构。

更准确地说,JPA实体必须具有一些Id定义。但是JPAId不一定必须映射到表主键上(并且JPA可以以某种方式处理没有主键或唯一约束的表)。

是否可以创建将与这样的数据库结构一起工作的JPA(休眠)实体?

如果表中有一列或一组列具有唯一值,则可以像Id在JPA中一样使用此唯一列集

如果您的表根本没有唯一的列,则可以将所有列用作Id

并且如果您的表有一些ID,但您的实体没有,请将其设为Embeddable

参见Java持久性书:身份和排序

您问题的相关部分是“无主键”部分

有时您的对象或表没有主键。在这种情况下,最好的解决方案通常是将生成的ID添加到对象和表。如果没有此选项,则有时表中有一列或一组列构成唯一值。您可以将此唯一的列集用作JPA中的ID。JPAId
不必总是与数据库表的主键约束匹配,也不需要主键或唯一约束。

如果您的表确实没有唯一列,则将所有列用作ID。通常,发生这种情况时数据是只读的,因此即使表允许具有相同值的重复行,对象也将始终相同,因此JPA认为它们是同一对象无关紧要。允许更新和删除的问题在于,无法唯一标识对象的行,因此所有匹配的行都将被更新或删除。

如果您的对象没有ID,但其表却有ID,则可以。将对象设为Embeddable对象,可嵌入对象没有ID。您将需要一个Entity包含它Embeddable的持久化和查询它。

我猜您可以使用@CollectionOfElements(对于hibernate / jpa 1)/ @ElementCollection(jpa 2)将“实体属性”的集合映射到Listin中entity

您可以创建EntityProperty类型并使用以下注释@Embeddable

如果实体和entity_property之间存在一对一的映射,则可以使用entity_id作为标识符。

本文地址:http://java.askforanswer.com/meiyouiddejpashiti.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!