2011-01-05 6 views
3

최대 절전 모드 객체 ForumMessage를로드하려하지만 다른 객체가 포함되어 있습니다. Users 및 Users 객체가로드되지 않습니다.Hibernate가 관련 객체를로드하지 않음

내 ForumMessage 매핑 파일 :

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Jan 4, 2011 10:10:29 AM by Hibernate Tools 3.4.0.Beta1 --> 
<hibernate-mapping> 
    <class name="com.BiddingSystem.Models.ForumMessage" table="FORUMMESSAGE"> 
     <id name="ForumMessageId" type="long"> 
      <column name="FORUMMESSAGEID" /> 
      <generator class="native" /> 
     </id> 
     <property name="ForumMessage" type="java.lang.String"> 
      <column name="FORUMMESSAGE" /> 
     </property> 
     <many-to-one name="User" class="com.BiddingSystem.Models.Users" fetch="join"> 
      <column name="UserId" /> 
     </many-to-one> 
     <property name="DatePosted" type="java.util.Date"> 
      <column name="DATEPOSTED" /> 
     </property> 
     <many-to-one name="Topic" class="com.BiddingSystem.Models.ForumTopic" fetch="join"> 
      <column name="TopicId" /> 
     </many-to-one> 
    </class> 
</hibernate-mapping> 

와 나는 follwing을 코드를 사용하고 있습니다 :

당신은 "거짓"= 게으른뿐만 아니라 추가 할 필요가
Session session = gileadHibernateUtil.getSessionFactory().openSession(); 

      SQL="from ForumMessage"; 


    System.out.println(SQL); 
    Query query=session.createQuery(SQL); 
    System.out.println(query.list().size()); 
    return new LinkedList <ForumMessage>(query.list()); 
+0

해당 테이블 정의를 표시 할 수 있습니까? – jaydel

+0

나는 이것이 최대 절전 모드의 게으른 로딩이라고 생각한다. 사용하기 전에 객체가로드되지 않는다. "ForumMessage"연결된 목록에서 사용자 객체에 액세스를 시도한다. – exiter2000

답변

3
<many-to-one name="User" class="com.BiddingSystem.Models.Users" fetch="join" lazy="false"> 

.

+0

덕분에, 그것은 작동합니다! – Noor

+0

하, 2017 년에 당신의 충고를 받아 냈고 그걸로 일했습니다 :) – SoltanG

2

ForumMessage가로드 될 때 사용자를로드하는 many-to-one 매핑에 lazy="false"을 추가 할 수 있습니다. 또는 Hibernate.initialize()를 사용하여 사용자 목록을 초기화 할 수 있습니다. 세션을 닫기 전에이 작업을 반드시 수행하십시오.

Session session = gileadHibernateUtil.getSessionFactory().openSession(); 
string sql = "from ForumMessage"; 
Query query = session.createQuery(sql); 
List results = query.list() 
for(ForumMessage message : results) 
{ 
    Hibernate.initialize(message.User); 
} 
return new LinkedList <ForumMessage>(results); 

필요한 경우에만 수행해야합니다. 디폴트로 Hibernate는 데이터베이스에 불필요한 호출을 피하기 위해 객체를 지연 적으로로드한다. 예를 들어 :

public LinkedList getMessages() 
{ 
    //It's assumed the session is opened and closed elsewhere. 
    string sql = "from ForumMessage"; 
    Query query = session.createQuery(sql); 
    List results = query.list(); 
    //The overhead of extra calls to the database occur here. 
    //This would have a similar impact if lazy load is set to false. 
    for(ForumMessage message : results) 
    { 
     Hibernate.initialize(message.User); 
    } 
    return new LinkedList <ForumMessage>(results); 
} 

public void printMessages() 
{ 
    LinkedList messages = getMessages(); 
    for(ForumMessage message : messages) 
    { 
     System.out.println(message.ForumMessage); 
    } 
} 

위의 코드 샘플에서 오버 헤드는 모든 사용자 객체를로드에 발생되지만, 그 객체는 사용되지 않습니다. 만약 Hibernate의 lazy-loading이 사용 되었다면이 여분의 오버 헤드는 발생하지 않을 것이다. 다음 예제에서는 목록이 사용될 때까지 사용자 목록이로드되지 않습니다. 이렇게하면 데이터가 실제로 필요하기 전까지 데이터베이스에 호출이 수행되지 않습니다.

public LinkedList getMessages() 
{ 
    //It's assumed the session is opened and closed elsewhere. 
    string sql = "from ForumMessage"; 
    Query query = session.createQuery(sql); 
    List results = query.list(); 
    return new LinkedList <ForumMessage>(results); 
} 

public void printMessages() 
{ 
    LinkedList messages = getMessages(); 
    for(ForumMessage message : messages) 
    { 
     //Hibernate will load the users objects here when they are accessed. 
     for(Users user : message.User) 
     { 
      System.out.println(user); 
     } 
    } 
} 

지연로드가 모두로드 될 때주의해야 할 점은 활성 세션에서 수행해야합니다. 액티브 세션이없고 아직로드되지 않은 무언가에 액세스하려고하면 Hibernate는 LazyInitializationException을 던질 것이다.

또한, Hibernate의 lazy load 기능을 사용하면 Hibernate.initialize()를 사용할 때 persistence ignorance라는 개념에 더 부합한다.

+0

다시 - 2017 년에이 조언을 받아 냈고 :) – SoltanG

관련 문제