0

我有一个 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

4 回答 4

1

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

<properties name="firstName_lastName_unique" unique="true">
        <property name="firstName"/>
        <property name="lastName"/>
</properties>
于 2012-05-10T14:58:24.027 回答
0

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

于 2012-05-10T12:25:50.337 回答
0

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

于 2012-05-10T12:26:07.097 回答
0

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

  1. 该列要么被定义为自动增量(例如 MySQL),要么具有序列(例如 Oracle)
  2. 保存新行时,成员变量 id 设置为 0。

我可以想象,当你用以前的信息保存一个新值时,变量 id 仍然有一个值!= 0,在这种情况下,数据库使用给定的值而不是生成一个新的唯一值,这将由于唯一而失败约束。

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

于 2012-05-10T12:51:02.793 回答