Hibernate复合密钥id生成器

Hibernate复合密钥id生成器,hibernate,Hibernate,我的实体如下。 我的数据模型如下所示,我无法更改引用性。 所以我被复合钥匙卡住了。 我想为orderId自动生成/使用一些生成器 是的,我在下面读过。 我不想像上面建议的那样管理id生成过程,因为应用程序生成orderId 如何使部分id生成器工作。。我的选择是什么……非常感谢专家们的一些想法 @Entity @Table(name = "Orders", uniqueConstraints = @UniqueConstraint(columnNames = {"partner_ID", "o

我的实体如下。 我的数据模型如下所示,我无法更改引用性。 所以我被复合钥匙卡住了。 我想为orderId自动生成/使用一些生成器

是的,我在下面读过。

我不想像上面建议的那样管理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(即复合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;}
}