Hibernate复合键ID生成器

4
我有以下实体。 我的数据模型强制执行以下内容,我无法更改引用完整性。 因此,我被困在复合键中。 我想要自动生成/使用一些生成器来生成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;
}

}

我认为这个问题和答案会有所帮助:https://dev59.com/hGw15IYBdhLWcg3wxunL - danny.lesnik
1
谢谢提供的链接,但并没有帮助,正如您所看到的,我正在尝试为构成主复合键的三列之一生成ID。目前,我考虑在外部生成OrderID并将其设置为对象,但我不喜欢这种方法。但是这篇文章并没有得到太多关注。 - user973779
这可能会有所帮助:https://vladmihalcea.com/how-to-map-a-composite-identifier-using-an-automatically-generatedvalue-with-jpa-and-hibernate/ - JavaTec
4个回答

9
我一直在搜索全球网站上所有可能的链接,试图找出为什么您不能在@EmbeddedId或@IdClass(即复合主键)中使用@GeneratedValue。原因是您根本不能这样做。这里提供的解释可能会让您感觉好些:JAVA.NET/GLASSFISH 复合主键是基于分配而不是生成的。因此,任何@GeneratedValue的东西都不应该与它们一起使用。我在我的项目中也遇到了问题,我认为除了以下方法外,没有其他方法:
如果您知道您的@GeneratedValue ID在您的域(例如您的数据库)的背景下始终是唯一的,则不需要使用复合主键,并且可以进行一些内部检查以确定记录的唯一性(即持久化对象集合)。

同意,直到有人能够给出更好的答案。 - user973779
@user973779 很遗憾,事实就是这样(并不是粗鲁的意思,请不要误解)...如果你有一个复合键,那么它意味着你不希望该键由IoC容器(我指的是Spring,但也可能是本地ODBC容器)管理。相反,拥有自动生成的PK意味着你依赖于容器...我试图超越自己,革新关系型数据库管理系统的工作方式...:P...我不知道我是否成功地总结了这个问题,但你可以得到更多的意见...我们在办公室进行了头脑风暴,这基本上就是结论! - ha9u63a7

1

使用@IdClass可以管理复合主键的生成策略。为需要复合主键的类注释@IdClass。使用@Id和@GeneratedValue注释构成复合主键的字段。这样就可以实现。

@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 表的复合主键。它们的值是自动生成的。

1

我认为这个stackoverflow的问题可能会对你有帮助。虽然它是为了不同的目的而提出的,但它有你可能需要的答案。它已经使用了复合主键和生成类型。


0

使用@IdClass不是一个解决方案吗? 可以在构成主键的每个列上使用@Id,以及在应由序列生成的@Id列上使用@GeneratedValue和@SequenceGenerator。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接