我是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)
请帮助我......
答案 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。希望你能理解。