休眠自动增量 MySQL

Posted

技术标签:

【中文标题】休眠自动增量 MySQL【英文标题】:Hibernate auto_increment MySQL 【发布时间】:2016-09-01 10:39:05 【问题描述】:

我正在使用 Eclipse、Xammp(tomcat 和 mysql DB)和 Hibernate。

这一切都很好,但我无法在数据库中创建实体 ID 将是 auto_increment

我的实体:

package com.jwt.hibernate.bean;


import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.annotations.GenericGenerator;



@Entity
public class User 

    @Id
    @GenericGenerator(name="generator", strategy="increment")
    @GeneratedValue(generator="generator")
    private Long userId;
    private String userName;
    private String password1;
    private String email;
    private String phone;
    private String city;


    public Long getUserId() 
        return userId;
    


    public void setUserId(Long userId) 
        this.userId = userId;
    


    public String getUserName() 
        return userName;
    


    public void setUserName(String userName) 
        this.userName = userName;
    

    public String getPassword1() 
        return password1;
    

    public void setPassword1(String password1) 
        this.password1 = password1;
    

    public String getEmail() 
        return email;
    

    public void setEmail(String email) 
        this.email = email;
    

    public String getPhone() 
        return phone;
    

    public void setPhone(String phone) 
        this.phone = phone;
    

    public String getCity() 
        return city;
    

    public void setCity(String city) 
        this.city = city;
    

我使用 Hibernate 的插件为此实体创建了一个 hbm.xml 并使用 Hibernate XML Mapping file(hbm.xml): 创建 hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 06.05.2016 11:59:26 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.jwt.hibernate.bean.User" table="USER">
        <id name="userId" type="java.lang.Long">
            <column name="USERID" />
            <generator class="assigned" />
        </id>
        <property name="userName" type="java.lang.String">
            <column name="USERNAME" />
        </property>
        <property name="password1" type="java.lang.String">
            <column name="PASSWORD1" />
        </property>
        <property name="email" type="java.lang.String">
            <column name="EMAIL" />
        </property>
        <property name="phone" type="java.lang.String">
            <column name="PHONE" />
        </property>
        <property name="city" type="java.lang.String">
            <column name="CITY" />
        </property>
    </class>
</hibernate-mapping>

我的hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="current_session_context_class">thread</property>
        <property name="hbm2ddl.auto">create-drop</property>
        <property name="show_sql">true</property>

        <mapping resource="/com/jwt/hibernate/bean/User.hbm.xml" />
    </session-factory>
</hibernate-configuration>

如果我启动我的代码,控制台会:

Hibernate: drop table if exists USER
Hibernate: create table USER (USERID bigint not null, USERNAME varchar(255), PASSWORD1 varchar(255), EMAIL varchar(255), PHONE varchar(255), CITY varchar(255), primary key (USERID))

一切都很好,但我的 ID 不是 auto_increment,我不知道为什么。 我尝试了很多注释。 示例 ManyToManyManyToOne 的其他注释有效,但要注意 @GeneratedValue

【问题讨论】:

不要对同一个类使用注解和hbm.xml映射。 【参考方案1】:

使用

    <id name="userId" type="java.lang.Long">
        <column name="USERID" />
        <generator class="native" />
    </id>

而不是下一行

    <id name="userId" type="java.lang.Long">
        <column name="USERID" />
        <generator class="assigned" />
    </id>

【讨论】:

这行得通。太感谢了。我现在不知道为什么 Hibernate 插件会创建错误的 hbm.xml 但现在 Hibernate: create table USER (USERID bigint not null auto_increment, USERNAME varchar(255), PASSWORD1 varchar(255), EMAIL varchar(255), PHONE varchar(255), CITY varchar(255), primary key (USERID)) 我做到了,我必须在我的 Questien 之后等待 5 分钟才能接受这个。你现在知道为什么 eclips 会像 ` 那样生成它吗?不像&lt;generator class="assigned" /&gt; @NiklasEhrenholz 可能是针对旧的 Hibernate 版本【参考方案2】:

你可以在你的 getUserId 方法上使用这个注解:

@Id
@GenericGenerator(name = "id_generator", strategy = "increment")
@GeneratedValue(generator = "id_generator")
@Column(name = "id", unique = true, nullable = false)
public Long getUserId() 
      return userId;

或者您也可以在当前代码中执行此操作,只需在 getUserId 方法上指定 @Column

@Column(name = "id", unique = true, nullable = false)
public Long getUserId() 
      return userId;

【讨论】:

你的意思是 @Entity public class User private Long userId; 在 setter 之前 @Id @GenericGenerator(name = "id_generator", strategy = "increment") @GeneratedValue(generator = "id_generator") @Column(name = "id", unique = true, nullable = false) public Long getUserId() return userId; 所以 Antoations 就在 setter 之前而不是在 private Long userId 之前 是的,你应该在 id 的 getter 方法上指定上述注解 请不要对主键列使用不必要的注释,例如@Column(unique = true)【参考方案3】:

如果你会使用注解,这就足够了

@Id
@GeneratedValue
@Column(name = "id")
public Long getUserId() 
      return userId;

【讨论】:

以上是关于休眠自动增量 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

休眠自动增量

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

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

多个数据库的休眠自动增量字段

修复自动增量mysql [重复]

在脚本mysql中重置自动增量列值