[英]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_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
。 但是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。 您將需要一個包含此Embeddable
的Entity
來持久化並查詢它。
我想你可以使用@CollectionOfElements
(對Hibernate / JPA 1)/ @ElementCollection
(JPA 2)的“實體性”的集合映射到List
中的entity
。
您可以創建EntityProperty
類型並使用@Embeddable
注釋它
如果entity和entity_property之間存在一對一映射,則可以使用entity_id作為標識符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.