2011-09-30 117 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,这些列应由序列生成。