Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 在持久化/保存实体时休眠覆盖数据_Hibernate - Fatal编程技术网

Hibernate 在持久化/保存实体时休眠覆盖数据

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 =

我是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
@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个开始。