1

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

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


// setter and getter
}

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

4

3 回答 3

2

您可以使用注释来做同样的事情。

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

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

// setter and getter
}

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

于 2010-03-25T14:54:47.777 回答
1

您有多种选择:

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

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

于 2010-03-24T22:37:39.137 回答
1

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

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

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

)

这样,您就不能插入重复数据。

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

  • 按名称和所有者查找(如果您经常这样做,索引可能是个好主意)
  • 如果找不到条目,​​请插入
  • 您可能还想捕获在违反唯一约束的情况下引发的异常(是的,如果两个线程同时插入数据,仍然可能发生)并重试选择。
于 2010-03-25T14:34:53.043 回答