Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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
Java hibernate中的更新方法不会替换旧数据,而是创建新数据?_Java_Hibernate - Fatal编程技术网

Java hibernate中的更新方法不会替换旧数据,而是创建新数据?

Java hibernate中的更新方法不会替换旧数据,而是创建新数据?,java,hibernate,Java,Hibernate,下面是我的简单代码,将一些代码保存在XML文件中 <?xml version='1.0' encoding='utf-8'?> <!-- JDBC connection pool (use the built-in) --> <property name="connection.pool_size">1</property> <!-- SQL dialect --> <property name

下面是我的简单代码,将一些代码保存在XML文件中

<?xml version='1.0' encoding='utf-8'?>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>

    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

    <!-- Disable the second-level cache  -->
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>

    <!-- Drop the existing tables and create new one -->
    <property name="hbm2ddl.auto">update</property>

    <!-- Mention here all the model classes along with their package name -->

    <mapping class="com.hibernate.Student"/>

</session-factory>
主要问题是:

package com.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class Main {
    public static void main(String[] args){
        Student student= new Student();
        student.setName("Chang");
        SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory();
        Session session=sessionFactory.openSession();
        session.beginTransaction();

        //session.save(student);

        //get a student from the databse
        student=(Student)session.get(Student.class, 1);
        System.out.println("Student Object have student name as:"+student.getName());

        student.setName("Chang_update");
        session.update(student);

        session.getTransaction().commit();
        session.close();
        //sessionFactory.close();       
    }
}
首先,我想创建一个新表并插入一个新学生。所以我让
创建
。我有一个
会话。保存(学生)我没有以下代码部分:

student=(Student)session.get(Student.class, 1);
System.out.println("Student Object have student name as:"+student.getName());

student.setName("Chang_update");
session.update(student);
然后我想测试get和update方法。因此,我更改了
更新
,删除了
会话。保存(学生)并添加

student=(Student)session.get(Student.class, 1);
System.out.println("Student Object have student name as:"+student.getName());

student.setName("Chang_update");
session.update(student);
然后我运行代码。get方法在返回Chang时运行良好。但是对于更新方法,我认为它将替换旧数据。但它的结果是一个叫Chang_update的新学生的RollNo为1。老张的罗尔诺变成了2号


我不熟悉hibernate,你们能告诉我这里发生了什么吗?

不要认为这是问题所在,但应该确定@Version列,以便hibernate能够正确地进行并发管理

带有GenerationType.AUTO的@Id允许Hibernate管理PK。因为id字段是int(原语)vs.Integer(可以有null),所以其中总是有一个值,甚至是零。因此,不要认为hibernate可以判断这是否是一个新行,并且每次都需要创建一个新行,并且无论出于何种原因,知道已经有一个PK为1并更新另一个


不完全熟悉自动,但我建议将id字段更改为整数,或者使用序列对象生成。

All
AUTO
influences是Hibernate管理PK值的方式。这意味着一些数据库可能基于一个序列,另一些数据库基于一个标识/自动增量列,等等。
auto
告诉Hibernate让数据库指定选择的方法,而不是所有数据库供应商的特定方法。正如@ScottSosna所说,您的问题是,您的PK值应该是对象类型,而不是原语。
student=(Student)session.get(Student.class, 1);
System.out.println("Student Object have student name as:"+student.getName());

student.setName("Chang_update");
session.update(student);