当前位置: 首页 > 面试题库 >

休眠复合键ID生成器

阙佐
2023-03-14
问题内容

我的实体如下。我的数据模型在下面强制执行,因此我无法更改引用的完整性。因此,我陷入了复合键的困境。我想自动生成/使用一些生成器作为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;
}

}

问题答案:

我一直将鼠标悬停在万维网站点上的所有可能链接上,试图找到为什么不能将@GeneratedValue与@EmbeddedId或@IdClass(即复合PK)一起使用的原因。原因是您不能。这里提供的解释可能会帮助您感觉更好:
JAVA.NET/GLASSFISH

复合PK基于分配而不是基于生成。因此,任何@GeneratedValue东西都不应该与它们一起使用。我的项目也遇到了问题,我认为没有别的办法,除了:

如果您知道@GeneratedValue
ID在域(例如,数据库)的上下文中始终是唯一的,则无需使用复合PK并进行一些内部检查以确定记录的唯一性(即持久性对象集合) 。



 类似资料:
  • 问题内容: 任何人都知道一些有关如何为hibernate创建自定义ID生成器的好教程吗? 问题答案: 在Google上粗略搜索“hibernate自定义ID生成器教程”,发现了以下可能性。我排除了那些看起来没有用的内容,并总结了它们的内容。 http://www.devx.com/Java/Article/30396-涵盖了在数据保留之前生成ID(因此还没有业务密钥)的问题。 http://doc

  • 问题内容: 尝试将Hibernate与SAP HANA内存数据库连接时遇到一些性能问题,该数据库不支持AUTO_INCREMENT(http://scn.sap.com/thread/3238906)。 因此,我将Hibernate设置为使用序列进行ID生成。 但是,当我插入大量记录(例如40000)时,Hibernate首先会生成ID。看起来像: 并且只有在生成所有ID之后,它才开始实际插入。

  • 问题内容: 我有一张带有自动增加的ID(每天刷新)的复合主键的表,并传递值。我正在将Hibernate用于数据库进程。我可以知道保存后如何立即检索自动增加的ID值吗?我试图获取ID,但是自动增加ID却没有显示任何价值。 码: 我尝试在保存如下表后获取ID值TableAPK id = dao.persist(session,entity); 或保存后添加刷新和刷新 但是我仍然无法检索tableAId

  • 问题内容: 我正在使用JPA并收到以下警告。我已经对此进行了研究,并了解了为什么需要覆盖它以及Hibernate如何使用这些方法。我仍然有一个问题: 例外: 复合ID类不会覆盖equals() 题: 为什么Hibernate只关心没有复合ID的类?如果只有一个出席者,默认情况下是否会在现场进行比较,还是这里发生的事情更复杂? 问题答案: 因为当实体没有复合ID时,它们只有一个,即一种基本支持的类型

  • 问题内容: hibernate如何生成外键约束名称? 如果我没有定义名称,hibernate将生成类似这样的内容 这个名字是怎么产生的?也许来自字段名称的哈希值或类似的东西?我需要知道所有实例上的名称是否相等。 问题答案: Hibernate通过串联表和属性名称来生成约束名称,并将结果转换为。由于某些数据库中的约束名称长度限制,因此需要它。例如,在Oracle数据库中,外键名称的长度不能超过30个

  • 问题内容: 这将创建以下架构: 观察:当我将序列设置为1时,第一个自动生成的是。当我将值设置为时,第一个ID为。 于是,不知何故该序列的当前valuze总是得到 成倍 的。为什么?如何防止这种情况,而只使用序列中的nexval? 问题答案: 此行为来自其参数的默认值50 。您可以根据需要进行更改: 这是出于性能原因。它允许Hibernate预订ID块,并防止每次需要新ID时都询问数据库。