我的实体如下。 我的数据模型在下面执行,我无法更改参照迭代。 所以我坚持使用复合键。 我想为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;
}
}
答案 0 :(得分:7)
我一直徘徊在万维网上的所有可能的链接上,并试图找到为什么你不能将@GeneratedValue与@EmbeddedId或@IdClass(即复合PK)一起使用。原因是你不能。这里提供的解释可能会让您感觉更好:JAVA.NET/GLASSFISH
复合PK基于ASSIGNMENT而不是基于GENERATION。因此,任何@GeneratedValue内容都不适用于它们。我的项目也有问题,我认为除此之外别无他法:
如果您知道您的@GeneratedValue ID在您的域(例如,您的数据库)的上下文中始终是唯一的,则您不需要使用复合PK并进行一些内部检查以确定记录的唯一性(即持久性对象集合。)
答案 1 :(得分:1)
我认为this question of stackoverflow可能会对您有所帮助。虽然它被要求用于不同的目的,但它有你可能需要的答案。它使用了复合主键和生成类型。
答案 2 :(得分:0)
不是使用@IdClass解决方案吗? 可以在构成主键的每个列上使用@Id,在@Id列上使用@GeneratedValue和@SequenceGenerator,它们应该由序列生成。
答案 3 :(得分:0)
复合主键的生成策略可以由@IdClass管理。使用@IdClass为您需要复合pk的类注释。使用@Id和@GeneratedValue注释复合pk的字段。这有效。 e.g。
@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的复合主键。它们的值是自动生成的。