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

时间:2010-10-27 12:57:24

标签: hibernate

我是Hibernate的新手。当我保存特定实体时,它会从现有实体重写数据。

我已将ID用作自动生成,如下所示:

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

这里我保存实体如下:

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();
    }
}

}

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

任何时候结果都会像

一样
mysql> select * from stud;

+----+--------+------+
| id | city   | name |
+----+--------+------+
|  1 | Mumbai | Test |
+----+--------+------+

1行(0.00秒)

我想要的是如下结果:

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

请帮助我......

5 个答案:

答案 0 :(得分:16)

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

原来这是我会话工厂的一个设置:

查找 hibernate.hbm2ddl.auto 设置,最有可能将其设置为 创建 。创建会话工厂时,此设置会执行此操作。 create 的作用是删除现有的模式(至少是它将使用的表)并创建一个新的模式,使其看起来像是覆盖表中的行。

您可以从此处选择一些不同的值。对于开发,我相信您需要设置 更新 ,因为如果它们不存在(就像创建一样)它将为您创建新表,但如果是表已存在,它将更新架构。

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

有关不同值的更多详细信息,请查看this excellent answer

答案 1 :(得分:2)

如果您想要进行更新而不是每次都向数据库添加新行,那么您需要检索所需的实体,进行任何所需的更新,然后再次保存实体。

答案 2 :(得分:2)

尝试使用saveOrUpdate(..)

请注意,JPA(Hibernate)实体由其@Id标识。如果您的对象具有与db中的对象相同的ID,则将进行更新。否则,从逻辑上讲,将发生插入。

答案 3 :(得分:0)

在创建的数据库表中添加一行可能会有所帮助

 `id` INT(11) NOT NULL AUTO_INCREMENT

当您向表中添加行时,AUTO_INCREMENT会增加ID计数。

答案 4 :(得分:0)

如果使用的是自动生成器类,则记录将自动添加到新的自动递增ID中。并且先前记录中的相同数据也将被写入下一个ID。因此,如果要插入新行,则每次运行应用程序时(Bad Practice)都要更改数据测试和孟买(使用Bad Practice),或者使用Scanner类从Keyboard读取数据并将其动态传递给setter。希望你能理解。