![](/img/trans.png)
[英]Hibernate - table per subclass with unions strategy - id to load is required for loading
[英]Hibernate subclass id generation in table per subclass
當我使用每個子類的表策略時,我的基(父類)包含復合主類。
@Column(nullable = false)
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XXX")
@SequenceGenerator(name = "XXX", sequenceName = "XXX", allocationSize = 1)
private Long systemId;
@Id
@Column(nullable = false)
private Long version;
因此,所有擴展此實體(如我所知)的實體均繼承ID及其帶注釋的屬性。 問題是,當我創建一個新的Parent實體時,主要對象是通過序列創建的,那就可以了。 但是,當我創建子類實例時,它會增加我不需要的父ID(從序列中創建一個新的主類),因為我使用table-per-subclass和主類必須相同。
問題:如何禁止子類中的id生成?
@Entity
@PrimaryKeyJoinColumns(
{
@PrimaryKeyJoinColumn(name = "systemId"),
@PrimaryKeyJoinColumn(name = "version")
}
)
public class SUb extends Parent {
public SUb (Parent t) {
super(t);
}
public SUb () {
}
...
... no ids...
創建子類時,它將發出兩個插入:
子類不繼承@Ids,而是使用:
作為FK到基礎表的關聯列。
因此,雖然基類具有由這兩列組成的主鍵:
子類應具有:
因此,在插入子類實體時,不應兩次調用該序列。
您可以確認數據庫表是否遵循此設計嗎?
我無法重現您的問題。 您能否更詳細地說明您的加入策略? 是InheritanceType.TABLE_PER_CLASS
還是InheritanceType.JOINED
? 盡管如此,我還是設法使用TABLE-PER-CLASS連接策略准備了完整的示例,當您持久SubDepartment
時,該策略僅遞增一次序列。 也許有幫助。
@Entity
@IdClass(CompoundPK.class)
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Department {
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XXX")
@SequenceGenerator(name = "XXX", sequenceName = "XXX", allocationSize = 1)
@Id
private Long id;
@Id
private Long version;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}
}
@Entity
public class SubDepartment extends Department {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class CompoundPK implements Serializable {
private Long id;
private Long version;
public CompoundPK() {
}
public CompoundPK(Long id, Long version) {
this.id = id;
this.version = version;
}
public Long getId() {
return id;
}
public Long getVersion() {
return version;
}
// hashCode & equals
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.