当持久化/保存实体时,HIbernate会覆盖数据

Swe*_*ety 6 hibernate

我是Hibernate的新手.当我保存特定的实体然后它重写现有的数据.

我使用ID作为自动生成如下:

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id")
private int id;
Run Code Online (Sandbox Code Playgroud)

在这里我保存实体如下:

class StudDAO() {

public static void main(String[] args){
     StudDAO obj = new StudDAO();
     Stud stud = new Stud();
     stud.setName("Test");
     stud.setCity("Mumbai");
     obj.createStud(stud);
}

public void createStud(Stud stud) {
  try {

    Session session = HibernateSessionFactory.getSessionFactory().openSession();
    Transaction transaction = session.beginTransaction();
    session.save(stud);
    transaction.commit();

    } catch (Exception e) {
      // TODO: handle exception
       e.printStackTrace();
       transaction.rollback();
    }
}
Run Code Online (Sandbox Code Playgroud)

}

如果我将在下次更改实体值,那么它应该生成下一个id而不是从第一个id开始.

任何时候结果都一样

mysql> select * from stud;

+----+--------+------+
| id | city   | name |
+----+--------+------+
|  1 | Mumbai | Test |
+----+--------+------+
Run Code Online (Sandbox Code Playgroud)

1排(0.00秒)

我想要的是如下结果:

mysql> select * from stud;
+----+--------+------+
| id | city   | name |
+----+--------+------+
|  1 | Mumbai | Test |
|  2 | Mumbai | Test |
+----+--------+------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

请帮我一样..

Sku*_*rpi 16

我意识到这是在一年前被问到的,但我和你有完全相同的问题,我想我会发布它,以防其他任何人拥有它.

事实证明这是我的会话工厂中的一个设置:

查找设置hibernate.hbm2ddl.auto,很可能你已将它设置为创建.创建会话工厂时,此设置会执行此操作.是什么创造所做的是,它降低现有的架构(至少它会使用表),并创建一个新的,使得它看上去就像是在你的表格覆盖行.

您可以从此处选择一些不同的值.对于开发,我相信你希望它设置更新,因为如果它们不存在(就像创建一样)它将为你创建新表,但如果表已经存在,它将更新模式.

对于生产,您应该坚持验证,因为它不会改变您的架构,只需验证它:)

有关不同值的更多详细信息,请查看此优秀答案