如何在休眠中映射自动增量字段?

Posted

技术标签:

【中文标题】如何在休眠中映射自动增量字段?【英文标题】:How to map an auto increment field in hibernate? 【发布时间】:2015-04-21 03:58:39 【问题描述】:

请看下面的 XML 代码

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Feb 17, 2015 10:01:43 PM by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="model.main.Family" table="family" catalog="****" optimistic-lock="version">
        <id name="idFamily" type="int">
            <column name="idFamily" />
            <generator class="assigned" />
        </id>
        <many-to-one name="employee" class="model.main.Employee" fetch="select">
            <column name="idEmployee" not-null="true" />
        </many-to-one>
        <property name="firstName" type="string">
            <column name="FirstName" length="45" />
        </property>
        <property name="middleName" type="string">
            <column name="MiddleName" length="45" />
        </property>
        <property name="lastName" type="string">
            <column name="LastName" length="45" />
        </property>
        <property name="dob" type="date">
            <column name="DOB" length="10" />
        </property>
        <property name="passportNumber" type="string">
            <column name="PassportNumber" length="45" not-null="true" />
        </property>
        <property name="dateLeft" type="date">
            <column name="DateLeft" length="10" />
        </property>
        <property name="lastUpdated" type="timestamp">
            <column name="LastUpdated" length="19" not-null="true" />
        </property>
        <set name="visas" table="visa" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="idFamily" />
            </key>
            <one-to-many class="model.main.Visa" />
        </set>
    </class>
</hibernate-mapping>

它是我的数据库表FamilyHibernate映射类。我们使用 mysql Work bench 单独创建数据库,然后生成映射类。如netbeans tutorial 的“生成 Hibernate 映射文件和 Java 类”部分所述,我们使用 netbeans 自动生成映射文件。

现在我们遇到了一个问题。也就是说,我们将表 Familyprimary key (idFamily) 更改为 MySQL 中的 auto generated 字段。现在,我们如何更改上述休眠代码,以便将idFamily 识别为自动生成的代码?

另一个问题是,手动编辑一个映射类而不通过工具重新生成所有映射会“破坏”系统吗?举个例子,比如搞砸人际关系?

【问题讨论】:

为什么不为休眠重新生成文件并比较差异? 【参考方案1】:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.tech.spring4.model.User" table="Customer">
<id name="id" type="long">
 <column name="USERID"  unique="true"/>
             <generator class="increment"/>
</id>
<property name="username"><column name="username" length="30" not-null="true"></column></property>
<property name="email"><column name="email" length="100" not-null="true"></column></property>
<property name="address"><column name="address" length="100" not-null="true"></column></property>
</class>
</hibernate-mapping>

【讨论】:

【参考方案2】:

您正在寻找一个 identity 列。这表示 RDBMS 自动生成列值作为行的标识。

请参阅这些Hibernate docs 了解更多信息。根据它:

身份 支持 DB2、MySQL、MS SQL Server、Sybase 和 HypersonicSQL 中的标识列。返回的标识符是 long、short 或 int 类型。

【讨论】:

【参考方案3】:

在注释中它对我有用

@GeneratedValue(strategy= GenerationType.IDENTITY)

希望它有效

<generated-value strategy="IDENTITY" /> 

【讨论】:

不错的一个。我被Cannot insert explicit value for identity column in table 'blablabla' when IDENTITY_INSERT is set to OFF. 迷住了,这个为我解决了:-)【参考方案4】:

只需替换您的生成器类以递增它会将其视为自动递增

<generator class="increment"/>

【讨论】:

他不想用Hibernate来创建id;他想告诉 Hibernate 它已经自动生成了。

以上是关于如何在休眠中映射自动增量字段?的主要内容,如果未能解决你的问题,请参考以下文章

休眠(mysql)刷新与提交中的自动增量

hibernate - 如何在 mysql 和 oracle 数据库中设置自动增量?

如何在ms访问中重置自动增量字段[重复]

如何使用 JPA 和休眠映射 Java/Kotlin 字符串数组和 Postgres SQL 数组

如何在使用存储过程时创建具有自动增量的 id 字段?

如何在流星上创建自动增量字段?