2011-09-30 173 views
3

我有我的實體如下。 我的數據模型在下面強制執行,我無法更改參考迭代。 所以我堅持使用複合鍵。 我想自動生成/使用一些發生器的訂單Id休眠組合鍵ID生成器

是的,我已閱讀下面。 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; 
} 

} 
+0

我覺得這個問題和答案將幫助: http://stackoverflow.com/questions/6405746/mapping-manytomany-with-composite-primary-key-and-annotation –

+1

感謝鏈接,也沒幫助,你可以看到我正在嘗試生成構成主要組合鍵的3列之一的ID ..在這一點上,我正在考慮生成OrderID外部並將其設置爲我不喜歡的對象..但這個帖子沒有太多的牽引力.. – user973779

+0

這可能有幫助:https://vladmihalcea.com/how-to-map-a-composite-identifier-using-an-automatically-generatedvalue-with-jpa-and-hibernate/ – JavaTec

回答

6

我一直在上空盤旋於萬維網網站所有可能存在的聯繫,並試圖找出爲什麼你不能用@GeneratedValue或@EmbeddedId @IdClass(即複合PKS)使用。原因是你只是不能。這裏提供的解釋可能會幫助你感覺好一些:JAVA.NET/GLASSFISH

複合材料PK是基於指派而不是基於GENERATION的。因此,任何@GeneratedValue的東西都不應該與他們一起工作。我也有我的項目的問題,我覺得沒有別的辦法,除了:

如果你知道你的@GeneratedValue ID始終是唯一的在你的域的情況下(例如,數據庫),你不不需要使用組合PK,並有一些內部檢查來確定記錄的唯一性(即持久性對象集合)。

+0

同意,直到有人可以給更好的答案 – user973779

+0

@ user973779不幸的是,我t就是它(不是粗魯的方式,請不要誤解我的意思)...如果你有一個組合鍵,這意味着你不需要IoC容器管理的鍵(我的意思是Spring,但它也可能是本地ODBC容器)。相反,擁有一個自動生成的PK意味着你依賴於容器......我試圖做的是重新審視我的頭並徹底改變RDBMS如何工作...:P ...我不知道有多好我總結了一下,但你可以得到更多的意見......我們在辦公室做了頭腦風暴,這就是結論,非常非常! – ha9u63ar

0

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