我正在开发一个简单的hibernate crud应用程序,我在表LOCATION上进行CRUD操作。 我使用的是maven 3.0,hibernate 3.6,oracle 10g,java 8。
我正在执行这4项操作。 1)在表中插入一行位置(成功) 2)检索该行以检查状态(成功) 3)更新同一记录的一列(成功。正在更新数据库) 4)再次检索同一行。这是捕获。我没有得到已在步骤3中更新的行的更新状态。我得到的结果是在步骤2检索中返回的。
这是我的主要课程。
public class App {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().openSession();
//step 1
session.beginTransaction();
saveLocation(session);
session.getTransaction().commit();
//step 2
session.beginTransaction();
retrieveLocation(session);
session.getTransaction().commit();
//step 3
session.beginTransaction();
updateLocation(session);
session.getTransaction().commit();
//step 4
session.beginTransaction();
retrieveLocation(session);
session.getTransaction().commit();
}
private static void saveLocation(final Session session) {
Location location = new Location();
location.setZip("751001");
location.setCity("Bhubaneswar");
location.setCountry("India");
location.setRegion("Asia pacific");
session.save(location);
}
private static void retrieveLocation(final Session session) {
Query query = session.createQuery("from org.bhawani.practice.hibernate.location.Location where zip = :zip");
query.setParameter("zip", "751001");
List<Location> locations = query.list();
for (Location location : locations) {
System.out.println("City: " + location.getCity());
}
}
private static void updateLocation(final Session session) {
Query query = session.createQuery(
"update org.bhawani.practice.hibernate.location.Location set city = :city where zip = :zip");
query.setParameter("city", "Cuttack");
query.setParameter("zip", "751001");
query.executeUpdate();
}
}
这是我的模型类Location.java
package org.bhawani.practice.hibernate.location;
public class Location {
private String zip;
private String city;
private String country;
private String region;
public Location() {
}
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getRegion() {
return region;
}
public void setRegion(String region) {
this.region = region;
}
}
这是我的hibernate映射xml。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="org.bhawani.practice.hibernate.location.Location"
table="LOCATION">
<id name="zip" type="string">
<column name="ZIP" />
<generator class="assigned" />
</id>
<property name="city" type="string">
<column name="CITY" />
</property>
<property name="country" type="string">
<column name="COUNTRY" />
</property>
<property name="region" type="string">
<column name="REGION" />
</property>
</class>
</hibernate-mapping>
这是我的表格说明。
Name Null Type
------- -------- ------------------
ZIP NOT NULL VARCHAR2(255 CHAR)
CITY VARCHAR2(255 CHAR)
COUNTRY VARCHAR2(255 CHAR)
REGION VARCHAR2(255 CHAR)
这是我的hibernate配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:XE</property>
<property name="hibernate.connection.username">hr</property>
<property name="hibernate.connection.password">admin</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.default_schema">HR</property>
<property name="show_sql">true</property>
<mapping resource="org/bhawani/practice/hibernate/location/Location.hbm.xml" />
</session-factory>
</hibernate-configuration>
答案 0 :(得分:0)
您既不关闭也不清除查询之间的会话(持久性上下文),这就是每次从第一级缓存中提取相同Location
实例的原因。
此外,您正在通过HQL批量更新语句更新Location
,这不会影响已在内存中加载的实例(第一级缓存),如here所述:
使用DML可能违反对象/关系映射并可能会影响 对象状态。对象状态保留在内存中,并使用DML,即状态 内存中对象的内容不受影响,具体取决于操作 在底层数据库上执行。必须使用内存中的数据 如果使用DML,请小心。
和here:
执行批量更新或删除操作时应该小心 因为它们可能导致数据库和数据库之间的不一致 活动持久性上下文中的实体。一般来说,批量 更新和删除操作应该只在一个内执行 在新的持久性上下文中或在获取之前或之前的事务 访问其状态可能受此类操作影响的实体。