2008-10-21 15 views
10

मैं एक और pojo में संग्रह में एक pojo जोड़ने की कोशिश कर रहा हूँ। मुझे यकीन है कि मैं लाइनों के साथ कहीं भी वास्तव में बेवकूफ गलती कर रहा हूं लेकिन मुझे पता नहीं लगा कि इसे कैसे हल किया जाए।दो खुले सत्रों के साथ संग्रह को जोड़ने का अवैध प्रयास

मैं एक POJO LookupTable जो स्तंभ के की एक सूची है है:

public class LookupTable { 
    private long id; 
    // More properties go here... 
    private List<Column> columns; 

    public void addColumn(Column column) { 
    this.columns.add(column); 
    } 

    // More methods go here... 
} 

मेरी हाइबरनेट विन्यास में मेरे पास है:

<class name="LookupTable" table="ARR_LOOKUP_TABLE"> 
    <id name="id" column="ID"> 
    <generator class="native"/> 
    </id> 
    <!-- Some properties here --> 
    <bag name="columns" cascade="all,delete-orphan" access="field"> 
    <key column="LOOKUP_TABLE" not-null="true"/> 
    <one-to-many class="Column"/> 
    </bag> 
</class> 

<class name="Column" table="ARR_LOOKUP_COLUMN"> 
    <id name="id" column="ID"> 
    <generator class="native"/> 
    </id> 
    <!-- Some properties here --> 
</class> 

मेरी स्प्रिंग कॉन्फ़िग फ़ाइल में मेरे पास है:

<tx:advice id="txAdvice" transaction-manager="txManager"> 
    <tx:attributes> 
    <tx:method name="*" propagation="REQUIRED"/> 
    </tx:attributes> 
</tx:advice> 
<aop:config> 
    <aop:pointcut id="managers" expression="execution(public * com.foo.*Manager.*(..))"/> 
    <aop:advisor advice-ref="txAdvice" pointcut-ref="managers"/> 
</aop:config> 

और अंत में कोड जहां यह सब मेरे प्रबंधक वर्ग (com.foo.LookupTableManager) में विफल रहता है:

public void addColumnToTable(Column column, long tableId) { 
    LookupTable lookupTable = this.lookupTableDao.findById(tableId); 
    lookupTable.addColumn(column); 
    this.lookupTableDao.saveOrUpdate(lookupTable); 
} 

यहाँ चर lookupTableDao एक सरल डीएओ वर्ग जो HibernateDaoSupport फैली को दर्शाता है।

त्रुटि मैं मिलता है:

org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions 
    at org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:410) 
    at org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:43) 
    at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101) 
    at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61) 
    at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55) 
    at org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:123) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:293) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:89) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70) 
    at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507) 
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499) 
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495) 
    at com.foo.AbstractDao.saveOrUpdate(AbstractDao.java:29) 
    at com.foo.LookupTableManager.addColumnToTable(LookupTableManager.java:338) 
... etc ... 

ठीक है, मैं मूल संदेश मैं हो रही है समझते हैं। लेकिन मुझे समझ में नहीं आता कि मुझे दूसरा सत्र कहाँ मिलता है .... क्या कोई मेरी मदद कर सकता है?

मैं हाइबरनेट 3.2.6.ga उपयोग कर रहा हूँ, स्प्रिंग 2.5.5 और बिलाव 6.0

उत्तर

4

ओह बकवास, समाधान थोड़ा सा सरल था। बाहर निकलता है मेरे पास लेनदेन नहीं था। मैंने अपनी अन्य कॉन्फ़िगरेशन फ़ाइलों में से एक में लगभग उसी लेनदेन कॉन्फ़िगरेशन का उपयोग किया। वहां पर पॉइंटकट को "प्रबंधक" भी कहा जाता था, इसलिए मेरा सलाहकार अन्य फाइल में पॉइंटकट का संदर्भ दे रहा था। पॉइंटकट का नाम बदलने से मेरी समस्या हल हो गई।

2

मेरा अनुमान है कि lookupTableDao.findById कॉल एक सत्र में अपने वस्तु हो रही है, लेकिन lookupTableDao.saveOrUpdate एक अलग से एक है - कैसे क्या आपको वसंत के माध्यम से Session ऑब्जेक्ट मिलता है?

Column ऑब्जेक्ट कहां से आ रहा है - क्या यह पहले ही डीबी या नया है?

+0

[संपादित करें, टिप्पणी करने के लिए जवाब में ले जाया]: मैं org.springframework.orm.hibernate.support.HibernateDaoSupport की विधि getSession() के माध्यम से सत्र हो रही है। यह वर्तमान लेनदेन से सत्र वापस कर देना चाहिए ... कॉलम ऑब्जेक्ट नव निर्मित है। –

1

समस्या ओपन सत्र के साथ फ़िल्टर मैपिंग देखने के साथ था। यह getSession और अन्य सहेजने पर एक सत्र बना रहा था।

आप केवल singleSession के रूप में झूठी डिफ़ॉल्ट बदल सकते हैं अपने असली

1

जाहिर मर्ज का उपयोग कर शायद समस्या

myInstance = (myInstanceClass) Session.merge(myInstance); 
0

ठीक कर देंगे आप केवल अपने कोड आप कुछ का उपयोग कर सकते का एक हिस्सा भर में एक सौदे चाहते हैं इस तरह:

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 

और कक्षा में:

@Autowired private SessionFactory sessionFactory; 

बाद में, कोड है कि एक ही लेन-देन में बातें करना चाहिए चारों ओर:

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 

Stuff stuff = getStuff(); 
manipulate(stuff); 
send(stuff); 
save(stuff); 

tx.commit(); 

मैं कुछ लंबे समय से चल बैच नौकरियों में एक पाश के अंदर इस का उपयोग करें।

1

मुझे अपने निम्नलिखित कोड के साथ एक ही समस्या थी: मैं एक निश्चित इकाई स्टोर को अपडेट करना चाहता था। मैं इस विधि से यह पुन: प्राप्त करने गया था:

@Override 
public Store getStoreByStoreId(final long storeId) { 
    getHibernateTemplate().execute(new HibernateCallback<Store>() { 
     @Override 
     public StoredoInHibernate(Session session) throws HibernateException, SQLException { 
      return (Store) session.createCriteria(Store.class) 
        .add(Restrictions.eq(Store.PROP_ID, storeId)) 
        .uniqueResult(); 
     } 
    }); 
} 

फिर, मैं निम्न विधि में दुकान को अद्यतन करने गया था:

@Override 
public void updateStoreByStoreId(final long storeId) { 
    getHibernateTemplate().execute(new HibernateCallback<Void>() { 
     @Override 
     public Void doInHibernate(Session session) throws HibernateException, SQLException { 
      Store toBeUpdated = getStoreByStoreId(storeId); 

      if (toBeUpdated != null){ 
       // ..change values for certain fields 
       session.update(toBeUpdated); 
      } 
      return null; 
     } 
    }); 
} 

यह पता चला मुझे मिल गया "अवैध प्रयास ..." त्रुटि क्योंकि प्राप्त विधि से पहला सत्र बंद नहीं हो रहा था, और मैं स्टोर के दूसरे सत्र के साथ अद्यतन करने की कोशिश कर रहा था। मेरे लिए समाधान अद्यतन विधि में स्टोर को पुनर्प्राप्त करने के लिए कॉल को स्थानांतरित करना था।

@Override 
public void updateStoreByStoreId(final long storeId) { 
    getHibernateTemplate().execute(new HibernateCallback<Void>() { 
     @Override 
     public Void doInHibernate(Session session) throws HibernateException, SQLException { 
      Store toBeUpdated = (Store) session.createCriteria(Store.class) 
        .add(Restrictions.eq(Store.PROP_ID, storeId)) 
        .uniqueResult(); 

      if (toBeUpdated != null){ 
       // ..change values for certain fields 
       session.update(toBeUpdated); 
      } 
      return null; 
     } 
    }); 
} 
0

मैं खिड़कियों उपयोग कर रहा था सर्वर आईआईएस और सिर्फ एकीकृत से AppPool प्रबंधित पाइपलाइन मोड को बदलने क्लासिक के लिए मेरी समस्या हल हो जाती।

धन्यवाद