簡體   English   中英

Hibernate復合鍵id生成器

[英]Hibernate composite key id generator

我有我的實體如下。 我的數據模型在下面執行,我無法更改參照迭代。 所以我堅持使用復合鍵。 我想為orderId自動生成/使用一些生成器

是的我已在下面閱讀。 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-mapping-identifier

我不想管理id生成過程,因為上面建議應用程序生成orderId。

如何使部分id生成器工作..我的選擇是什么...將非常感謝專家的一些想法。

@Entity
@Table(name = "Orders", uniqueConstraints = @UniqueConstraint(columnNames = {"partner_ID", "order_ident" }))
public class Order  {

private OrderId id;

public Order() {
}


@EmbeddedId
@AttributeOverrides({
        @AttributeOverride(name = "partnerId", column = @Column(name = "partner_ID", nullable = false)),
        @AttributeOverride(name = "employeeId", column = @Column(name = "employee_ID", nullable = false)),
        @AttributeOverride(name = "orderId", column = @Column(name = "order_ID", nullable = false)) })
public OrderId getId() {
    return this.id;
}

public void setId(OrderId id) {
    this.id = id;
}


}


@Embeddable
public class OrderId extends FactObject {

private int partnerId;
private int employeeId;
private int orderId;

public OrderId() {
}

public OrderId(int partnerId, int employeeId, int orderId) {
    this.partnerId = partnerId;
    this.employeeId = employeeId;
    this.orderId = orderId;
}

@Column(name = "partner_ID", nullable = false)
public int getpartnerId() {
    return this.partnerId;
}

public void setpartnerId(int partnerId) {
    this.partnerId = partnerId;
}

@Column(name = "employee_ID", nullable = false)
public int getemployeeId() {
    return this.employeeId;
}

public void setemployeeId(int employeeId) {
    this.employeeId = employeeId;
}

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")
@Column(name = "order_ID",insertable=false, nullable=false,  updatable=false)
public int getOrderId() {
    return this.orderId;
}

public void setOrderId(int orderId) {
    this.orderId = orderId;
}

public boolean equals(Object other) {
    if ((this == other))
        return true;
    if ((other == null))
        return false;
    if (!(other instanceof OrderId))
        return false;
    OrderId castOther = (OrderId) other;

    return (this.getpartnerId() == castOther.getpartnerId())
            && (this.getemployeeId() == castOther.getemployeeId())
            && (this.getOrderId() == castOther.getOrderId());
}

public int hashCode() {
    int result = 17;

    result = 37 * result + this.getpartnerId();
    result = 37 * result + this.getemployeeId();
    result = 37 * result + this.getOrderId();
    return result;
}

}

我一直徘徊在萬維網上的所有可能的鏈接上,並試圖找到為什么你不能將@GeneratedValue與@EmbeddedId或@IdClass(即復合PK)一起使用。 原因是你不能。 這里提供的解釋可能會幫助您感覺更好: JAVA.NET / GLASSFISH

復合PK是基於ASSIGNMENT的而不是基於GENERATION的。 因此,任何@GeneratedValue內容都不適用於它們。 我的項目也有問題,我認為除此之外別無他法:

如果您知道您的@GeneratedValue ID在您的域(例如,您的數據庫)的上下文中始終是唯一的,則您不需要使用復合PK並進行一些內部檢查以確定記錄的唯一性(即持久性對象集合) 。

我認為stackoverflow的這個問題可能會對你有所幫助。 雖然它被要求用於不同的目的,但它有你可能需要的答案。 它使用了復合主鍵和生成類型。

是不是使用@IdClass解決方案? 可以在構成主鍵的每個列上使用@Id,在@Id列上使用@GeneratedValue和@SequenceGenerator,它們應該由序列生成。

復合主鍵的生成策略可以由@IdClass管理。 使用@IdClass為您需要復合pk的類注釋。 使用@Id和@GeneratedValue注釋復合pk的字段。 這有效。 例如

@Entity
@IdClass(B.class)
Class A {
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private int i;
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private int j;

    private String variable;
}

Class B implements Serializable{
    private int i;
    private int j;

    public int geti(){return i;}
    public int getj(){return j;}
}

在此示例中,i和j的組合將作為A的復合主鍵。它們的值是自動生成的。

暫無
暫無

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

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