Hibernate 在持久化/保存实体时休眠覆盖数据
我是Hibernate新手。当我保存特定实体时,它会从现有实体重写数据 我已使用自动生成的ID,如下所示:Hibernate 在持久化/保存实体时休眠覆盖数据,hibernate,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 =
@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
@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 |
+----+--------+------+
一行一组(0.00秒)
我想要的结果如下:
mysql> select * from stud;
+----+--------+------+
| id | city | name |
+----+--------+------+
| 1 | Mumbai | Test |
| 2 | Mumbai | Test |
+----+--------+------+
2 rows in set (0.00 sec)
请为我提供相同的帮助。如果您希望每次更新而不是向数据库添加新行,则需要检索所需的实体,进行所需的更新,然后再次保存实体。尝试使用
保存或更新(…)
请注意,JPA(Hibernate)实体由其
@Id
标识。如果您的对象与数据库中的对象具有相同的id,则会发生更新。否则,从逻辑上讲,插入将发生。我意识到这是一年前提出的问题,但我遇到了与您完全相同的问题,我想我会发布它,以防其他人有
结果证明这是我的会话工厂中的一个设置:
查找设置hibernate.hbm2ddl.auto,很可能您已将其设置为create。此设置在创建会话工厂时执行操作。create所做的是删除现有的模式(至少是它将使用的表)并创建一个新的模式,使其看起来好像覆盖了表中的行
您可以从这里选择几个不同的值。对于开发,我相信您希望它设置update,因为如果表不存在,它将为您创建新表(就像create),但是如果表已经存在,它将更新模式
对于生产,您应该坚持验证,因为它不会改变您的模式,只需验证:)
有关不同值的更多详细信息,请选中在创建的数据库表中添加一行可能会有所帮助
`id` INT(11) NOT NULL AUTO_INCREMENT
当您向表中添加一行时,“自动增量”会增加id计数。如果您使用的是“类生成器自动”,则记录将自动添加到新的自动增量id。上一条记录中的相同数据也将写入下一个id。因此,如果要插入新行,请在每次运行应用程序时更改数据测试和设置(错误做法),或者使用Scanner类从键盘读取数据并将其动态传递给setter。希望您能理解。从他的示例来看,他似乎正在运行一个命令行示例,并希望后续执行不会向数据库中添加新条目。是的。但是还有其他方法吗?若我插入不同的实体值,那个么它只是从现有的实体值重写数据,而不是创建新记录。若我的表的最大id为2,那个么下一个插入的数据应该在第3个。但它只是从第1个开始。