2016-10-08 2 views
1

테이블 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(); 
    } 

} 

여기 여기 내 최대 절전 모드 매핑 XML입니다 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; 
    } 

} 

내 모델 클래스입니다.

<?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) 

는 같은 Location 인스턴스가 첫 번째 레벨 캐시에서 가져온 이유입니다, 당신은 쿼리 사이도 폐쇄 나 세션을 삭제 (영속 컨텍스트)입니다 내 최대 절전 모드 설정 파일

<?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

입니다 매번. DML이를 위반하여

: here을 설명

또한, 당신은 이미 메모리 (첫 번째 레벨 캐시)에로드 된 인스턴스에 영향을 미치지 않는 HQL 대량 업데이트 문을 통해 Location를 업데이트 오브젝트/관계형 맵핑이며 오브젝트 상태 인 에 영향을 미칠 수 있습니다. 개체 상태가 메모리에 남아 있고 DML을 사용하면 기본 데이터베이스에서 이 수행되는 작업에 따라 메모리 내 개체의 상태 인 이 영향을받지 않습니다. DML이 사용되는 경우 메모리 내 데이터는 을 사용해야합니다.

here : 작업 를 일괄 업데이트를 실행하거나 삭제할 때 데이터베이스 및 활성 영속 컨텍스트에서 엔티티 사이의 불일치가 발생할 수 있기 때문에

주의가 사용되어야한다. 일반적으로 대량의 업데이트 및 삭제 작업은 새 지속성 컨텍스트 또는 반입하기 전의 트랜잭션 내에서만 수행되어야하며 상태가 해당 작업의 영향을받을 수있는 엔터티에 액세스해야합니다.

+0

답장을 보내 주셔서 감사합니다. –

관련 문제