簡體   English   中英

沒有id的JPA實體

[英]JPA entity without id

我有一個具有以下結構的數據庫:

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)實體?

我猜你的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; 

    ...
}

我知道JPA實體必須有主鍵,但由於我無法控制的原因,我無法更改數據庫結構。

更准確地說,JPA實體必須定義一些Id 但是JPA Id不一定必須映射到表主鍵上(並且JPA可以某種方式處理沒有主鍵或唯一約束的表)。

是否可以創建將使用這樣的數據庫結構的JPA(Hibernate)實體?

如果表中有一列或一組列具有唯一值,則可以使用此唯一列集作為JPA中的Id

如果您的表根本沒有唯一列,則可以使用所有列作為Id

如果您的表有一些id,但您的實體沒有,請將其Embeddable

請參閱Java持久性書: 身份和排序

您的問題的相關部分是No Primary Key部分

有時您的對象或表沒有主鍵。 在這種情況下,最佳解決方案通常是將生成的id添加到對象和表中。 如果您沒有此選項,則有時表中會有一列或一組列構成唯一值。 您可以使用此唯一列集作為JPA中的ID。 JPA Id並不總是必須匹配數據庫表主鍵約束,也不需要主鍵或唯一約束。

如果您的表確實沒有唯一列,則使用所有列作為id。 通常,當發生這種情況時,數據是只讀的,因此即使表允許具有相同值的重復行,對象仍然是相同的,因此JPA認為它們是同一個對象並不重要。 允許更新和刪除的問題是無法唯一標識對象的行,因此將更新或刪除所有匹配的行。

如果你的對象沒有id,但它的'table',這很好。 使對象成為Embeddable對象,可嵌入對象沒有id。 您將需要一個包含此EmbeddableEntity來持久化並查詢它。

我想你可以使用@CollectionOfElements (對Hibernate / JPA 1)/ @ElementCollection (JPA 2)的“實體性”的集合映射到List中的entity

您可以創建EntityProperty類型並使用@Embeddable注釋它

如果entity和entity_property之間存在一對一映射,則可以使用entity_id作為標識符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM