没有 id 的 JPA 实体

新手上路,请多包涵

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

 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 (Hibernate) 实体?

原文由 Michael 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

I guess your entity_property has a composite key (entity_id, name) where entity_id is a foreign key to 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;

    ...
}

原文由 axtavt 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

是否可以创建将与这样的数据库结构一起使用的 JPA (Hibernate) 实体?

如果表中的一列或一组列具有唯一值,则可以将这组唯一的列用作 JPA 中的 Id

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

如果您的表有一些 id 但您的实体没有,请将其 Embeddable

原文由 Pascal Thivent 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题