避免在Hibernate中使用自动增量键进行复制

时间:2010-03-24 18:52:51

标签: java hibernate hbm

我正在尝试使用Hibernate自动增加id,但是,我尽量避免重复。

class Service
{
    Long id; // auto increment
    String name;
    String owner;
    Boolean incremental;


// setter and getter
}

我想要实现的是,每当我要保存的新服务对象具有与数据库中任何现有服务对象相同的名称和所有者(无论数据字段增量是否相同)时,它将是一个重复的条目。在这种情况下,我不想再向数据库中添加另一个条目。如何修改hbm.xml文件以避免此问题?

3 个答案:

答案 0 :(得分:2)

您可以使用注释来执行相同的操作。

在您的实体类之上,您可以编写以下内容:

@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "name","owner"}))
@Entity
class Service
{
    Long id; // auto increment
    String name;
    String owner;

// setter and getter
}

这将告诉hibernate列名和所有者应该是唯一的。

答案 1 :(得分:1)

您有多种选择:

  • 将您的主键定义为composite-idnatural-id
  • 保存之前,使用查询查找是否有另一行具有相同的名称和所有者,如果有 - 得到它。

无论哪种方式,您都应该使用hashCode()equals(..)

覆盖nameowner

答案 2 :(得分:1)

如果您需要id列,则可以保留它。 你需要的是什么 *两列上数据库级别的唯一约束。

(如果你使用hbmtoddl工具,你可能需要这样的东西:

<properties name="key" unique="true">
    <property name="name" .../>
    <property name="owner" .../>
</properties>

这样,就无法插入重复数据。

之后如果您在尝试插入重复项时不希望代码中断,则需要

  • 按名称和所有者查找(如果您经常这样做,索引可能是个好主意)
  • 如果您没有找到该条目,请将其插入
  • 您可能还希望捕获在唯一约束违规的情况下抛出的异常(是的,如果两个线程同时插入数据,可能仍会发生这种情况)并重试select。