Hibernate select查询没有从数据库返回最新记录

时间:2016-10-08 15:08:00

标签: hibernate

我正在开发一个简单的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>

1 个答案:

答案 0 :(得分:0)

您既不关闭也不清除查询之间的会话(持久性上下文),这就是每次从第一级缓存中提取相同Location实例的原因。

此外,您正在通过HQL批量更新语句更新Location,这不会影响已在内存中加载的实例(第一级缓存),如here所述:

  

使用DML可能违反对象/关系映射并可能会影响   对象状态。对象状态保留在内存中,并使用DML,即状态   内存中对象的内容不受影响,具体取决于操作   在底层数据库上执行。必须使用内存中的数据   如果使用DML,请小心。

here

  

执行批量更新或删除操作时应该小心   因为它们可能导致数据库和数据库之间的不一致   活动持久性上下文中的实体。一般来说,批量   更新和删除操作应该只在一个内执行   在新的持久性上下文中或在获取之前或之前的事务   访问其状态可能受此类操作影响的实体。