【问题标题】:Hibernate does not save Object when using @GeneratedValue(strategy=GenerationType.AUTO)Hibernate 在使用 @GeneratedValue(strategy=GenerationType.AUTO) 时不保存对象
【发布时间】:2019-07-26 19:15:48
【问题描述】:

我正在学习HibernateMySql 数据库,在制作小项目时我想出了奇怪的休眠行为。我正在尝试保存一个实体(代码如下),但实体没有持久保存到数据库中。我只使用session.save(e) 方法。如果我使用@GeneratedValue(strategy=GenerationType.IDENTITY),它就可以工作,如果我使用@GeneratedValue(strategy=GenerationType.AUTO),它就不行。

再次,如果我使用会话事务 (begin and commit),它在两种情况下都有效(AUTO 和 IDENTITY)。

再次,如果我使用两个不同的实体,一个是 AUTO,另一个是 IDENTITY,它正在工作。

第一个实体

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "EMPLOYEE")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "EMP_ID")
    private int empId;

    @Column(name ="name")
    private String name;

    public int getEmpId() {
        return empId;
    }

    public void setEmpId(int empId) {
        this.empId = empId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

第二个实体

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "SUPEMPLOYEE")
public class SupperEmploye {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "EMP_ID")
    private int empId;

    @Column(name ="name")
    private String name;

    public int getEmpId() {
        return empId;
    }

    public void setEmpId(int empId) {
        this.empId = empId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

保存实体的代码

Session s= HibernateConfig.getSessionFactory().openSession();
        //s.getTransaction().begin(); //working if add

        Employee e= new Employee();
        e.setName("Employee");
        s.save(e);

        SupperEmploye se = new SupperEmploye();
        se.setName("Super Employee");
        s.save(se);

        s.close();
        //s.getTransaction().commit(); // Working if add
        HibernateConfig.getSessionFactory().close();

注意:使用休眠 5、MySQL 8、JAVA 8

如果需要更多信息,请发表评论

【问题讨论】:

  • 试试@GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
  • @Sambit 出错,在持久化单元中没有定义名为“native”的生成器,需要一些配置吗?
  • 无需配置。
  • 您也可以尝试使用身份生成器来检查您是否能够保存。
  • 添加 @GenericGenerator(name = "native",strategy = "native") 后它可以工作了,谢谢

标签: java mysql hibernate


【解决方案1】:

试试这个

@GeneratedValue(strategy=GenerationType.IDENTITY)

【讨论】:

  • 感谢您的回答,但它与生成器一起使用,我很想知道仅 AUTO
  • 只包含代码的答案仍然是答案。
【解决方案2】:

你应该使用

@GeneratedValue(strategy = GenerationType.AUTO, generator = "native") 

而不是

@GeneratedValue(strategy = GenerationType.AUTO)

阅读下面这篇不错的文章。

https://vladmihalcea.com/why-should-not-use-the-auto-jpa-generationtype-with-mysql-and-hibernate/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-05
    • 2011-03-05
    • 2016-12-06
    • 2012-02-15
    • 2017-01-06
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多