不带 id 的 JPA 实体

2022-08-31 12:53:06

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

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

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

当我尝试创建实体属性类时

@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(休眠)实体,以便像这样使用数据库模式?


答案 1

我猜你有一个复合键,其中是一个外键。如果是这样,您可以按如下方式映射它:entity_property(entity_id, name)entity_identity

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

    ...
}

答案 2

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

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

是否有可能创建 JPA(休眠)实体,这些实体将像这样使用数据库结构?

如果表中有一列或一组列构成唯一值,则可以将此唯一列集用作 JPA 中的列。Id

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

如果您的表具有某个 ID,但您的实体没有,请将其设置为 .Embeddable


推荐