簡體   English   中英

每個子類在表中生成Hibernate子類ID

[英]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...

創建子類時,它將發出兩個插入:

  1. 基類之一
  2. 子類中的一個

子類不繼承@Ids,而是使用:

  • systemId

作為FK到基礎表的關聯列。

因此,雖然基類具有由這兩列組成的主鍵:

  • 序列生成的systemId
  • 手動分配的版本

子類應具有:

  • 帶有到基本sequnceId列的FK的sequnceId列
  • 一個帶有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.

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