Hibernate复合密钥id生成器
我的实体如下。 我的数据模型如下所示,我无法更改引用性。 所以我被复合钥匙卡住了。 我想为orderId自动生成/使用一些生成器 是的,我在下面读过。 我不想像上面建议的那样管理id生成过程,因为应用程序生成orderId 如何使部分id生成器工作。。我的选择是什么……非常感谢专家们的一些想法Hibernate复合密钥id生成器,hibernate,Hibernate,我的实体如下。 我的数据模型如下所示,我无法更改引用性。 所以我被复合钥匙卡住了。 我想为orderId自动生成/使用一些生成器 是的,我在下面读过。 我不想像上面建议的那样管理id生成过程,因为应用程序生成orderId 如何使部分id生成器工作。。我的选择是什么……非常感谢专家们的一些想法 @Entity @Table(name = "Orders", uniqueConstraints = @UniqueConstraint(columnNames = {"partner_ID", "o
@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(即复合PKs)结合使用。原因是你不能。这里提供的解释可能会帮助您感觉好一点: 复合PK基于分配而不是基于生成。因此,任何@GeneratedValue的东西都不应该与它们一起工作。我在我的项目中也遇到了问题,我认为没有其他办法,除了: 如果您知道您的@GeneratedValue ID在您的域(例如,您的数据库)上下文中始终是唯一的,那么您不需要使用复合PK并进行一些内部检查来确定记录的唯一性(即持久性对象集合)
我想可能对你有帮助。虽然它被问到不同的目的,但它有你可能需要的答案。它同时使用了复合主键和生成类型。是否使用@IdClass a解决方案?
可以在构成主键的每一列上使用@Id,在应由序列生成的@Id列上使用@GeneratedValue和@SequenceGenerator。复合主键的生成策略可以由@IdClass管理。用@IdClass注释需要复合pk的类。用@Id和@GeneratedValue注释构成复合pk的字段。这很有效。 e、 g
在本例中,i和j的组合将用作A的复合主键。它们的值是自动生成的 我想这个问题和答案会有帮助:谢谢你的链接没有帮助,因为你可以看到我正在尝试为构成主复合键的3列中的一列生成id。。此时,我正在考虑从外部生成OrderID,并将其设置为我不喜欢的对象。。但这篇文章并没有太大的吸引力。这可能会有所帮助:直到有人能给出更好的答案answers@user973779不幸的是,它就是这样(不是以一种粗鲁的方式,请不要误会我)…如果你有一个复合密钥,这意味着你没有IoC容器管理的密钥(我指的是Spring,但它也可能是本机ODBC容器). 相反,拥有一个自动生成的PK意味着你依赖于容器……我试图做的是彻底改变RDBMS的工作方式……:P……我不知道我总结得有多好,但你可以得到更多的意见……我们在办公室里进行了一次头脑风暴,这就是结论,非常多!
@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;}
}