Java hibernate中的更新方法不会替换旧数据,而是创建新数据?
下面是我的简单代码,将一些代码保存在XML文件中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 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字段更改为整数,或者使用序列对象生成。AllAUTO
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);