使用hibernate从数据库中删除重复的行

时间:2012-05-10 11:32:33

标签: java database hibernate hibernate-mapping

我有一个hbm文件,如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping auto-import="true" default-lazy="false">
    <class name="com.saman.entity.hibernate.EmployeeEntity"
           table="Employee" optimistic-lock="version">
        <id name="id">
            <column name="Id" sql-type="bigint"/>
            <generator class="native"/>
        </id>
        <timestamp name="version" source="db"/>
        <property  name="firstName">
            <column name="FirstName" sql-type="nvarchar(300)"/>
        </property>
        <property name="lastName">
            <column name="LastName" sql-type="nvarchar(300)"/>
        </property>
        <property name="employeeType">
            <column name="EmployeeType" sql-type="nvarchar(300)"/>
        </property>
        <set name="shifts" table="Shifts" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="Id" not-null="true"/>
            </key>
            <one-to-many class="com.saman.entity.hibernate.ShiftEntity"/>
        </set>
    </class>
</hibernate-mapping>

现在我想要如果我添加一个员工并坚持下去,如果我再添加一个员工以及之前的信息,我的系统会引发一个异常,并告诉我在数据库中有另一名员工有这些信息。

hibernate给我这个选项吗?

4 个答案:

答案 0 :(得分:1)

好吧,只需将其添加到您的映射

即可
<properties name="firstName_lastName_unique" unique="true">
        <property name="firstName"/>
        <property name="lastName"/>
</properties>

答案 1 :(得分:0)

我想我明白你想要达到的目标。但我不知道你是否先在stackoverflow中搜索你的问题。这可能是您的回答How to do multiple column UniqueConstraint in hbm?

答案 2 :(得分:0)

您是否在数据库的ID列上设置了自动增量?

答案 3 :(得分:0)

您已经拥有id值的生成器。这应该生成一个唯一的id,但只有在这两个条件成立时才会这样做:

  1. 该列被定义为自动增量(p.ex.MySQL)或具有序列(p.ex.Oracle)
  2. 保存新行时,成员变量id设置为0。
  3. 我可以想象,当您使用以前的信息保存新值时,变量id仍然具有值!= 0,在这种情况下,数据库使用给定值而不是生成新的唯一值,这将失败到期独特的约束。

    如果表上有第二个唯一索引,也会出现此错误。