Java 在Hibernate中使用自动递增键避免重复
我试图使用Hibernate自动增加id,但是,我试图避免重复Java 在Hibernate中使用自动递增键避免重复,java,hibernate,hbm,Java,Hibernate,Hbm,我试图使用Hibernate自动增加id,但是,我试图避免重复 class Service { Long id; // auto increment String name; String owner; Boolean incremental; // setter and getter } 我想要实现的是,每当我想要保存的新服务对象与数据库中的任何现有对象具有相同的名称和所有者(无论数据字段是否相同),它都将是一个重复的条目。在这种情况下,我不想再向数据库中
class Service
{
Long id; // auto increment
String name;
String owner;
Boolean incremental;
// setter and getter
}
我想要实现的是,每当我想要保存的新服务对象与数据库中的任何现有对象具有相同的名称和所有者(无论数据字段是否相同),它都将是一个重复的条目。在这种情况下,我不想再向数据库中添加其他条目。如何修改hbm.xml文件以避免此问题?您有许多选择:
- 将主键定义为或
- 保存前,使用查询查找是否有另一行具有相同名称和所有者,以及是否有-获取它
无论哪种方式,您都应该使用
name
和owner
覆盖hashCode()
和equals(…)
,您有许多选项:
- 将主键定义为或
- 保存前,使用查询查找是否有另一行具有相同名称和所有者,以及是否有-获取它
无论哪种方式,您都应该使用
name
和owner
覆盖hashCode()
和equals(…)
,如果您需要id列,您可以保留它。
你需要的是
*两列上的数据库级别的唯一约束
(如果您使用hbmtoddl工具,您可能需要这样的工具:
<properties name="key" unique="true">
<property name="name" .../>
<property name="owner" .../>
</properties>
)
这样,就不能插入重复的数据
之后,如果您不希望在尝试插入重复项时代码中断,则需要
- 按名称和所有者查找(如果您经常这样做,索引可能是个好主意)
- 如果找不到条目,请插入它
- 您可能还希望捕获在发生唯一约束冲突时引发的异常(如果两个线程同时插入数据,则仍然可能发生是),然后重试选择
<properties name="key" unique="true">
<property name="name" .../>
<property name="owner" .../>
</properties>
)
这样,就不能插入重复的数据
之后,如果您不希望在尝试插入重复项时代码中断,则需要
- 按名称和所有者查找(如果您经常这样做,索引可能是个好主意)
- 如果找不到条目,请插入它
- 您可能还希望捕获在发生唯一约束冲突时引发的异常(如果两个线程同时插入数据,则仍然可能发生是),然后重试选择
@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "name","owner"}))
@Entity
class Service
{
Long id; // auto increment
String name;
String owner;
// setter and getter
}
这将告诉hibernate列名称和所有者应该是唯一的。您可以使用注释来完成相同的操作 在实体类的顶部编写以下内容:
@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "name","owner"}))
@Entity
class Service
{
Long id; // auto increment
String name;
String owner;
// setter and getter
}
这将告诉hibernate列名称和所有者应该是唯一的。我认为您的答案很好。。。有人知道为什么它被降级了吗?我认为你的答案很好。。。有人知道它为什么被降级吗?@Shervin很高兴知道,Shervin(+1)@Shervin很高兴知道,Shervin(+1)