को जारी रखने के लिए पारित की गई है मुझे अपवाद प्राप्त हो रहा है। Eibernate.PersistentObjectException: अलग इकाई को जारी रखने के लिए पारित किया गया। इस मंच और अन्य जगहों पर तमाम पद से, मैं समझता हूँ कि इस दो मामलों में होता है (पर विचार नहीं एक-एक एनोटेशन आदि),इंटरमीटेंट त्रुटि org.hibernate.PersistentObjectException: पृथक इकाई
- वहाँ लेनदेन गुंजाइश
- एक आईडी से बाहर जाने के साथ एक मुद्दा है सेट है जहां इसे स्वचालित रूप से जेनरेट किया जाना चाहिए।
मुझे लगता है कि इनमें से कोई भी मेरे कोड के साथ नहीं हो रहा है। मैं त्रुटि को पुन: उत्पन्न करने में असमर्थ हूं, क्योंकि मेरे पास डेटा नहीं है जिसने शुरुआत में इसे ट्रिगर किया था। अन्य डेटा पर यह पूरी तरह से ठीक चलाता है। मैं नीचे एक SCCE प्रदान की है:
public class MyProcessor {
private MyImportEJB myEJB = MyImportEJB.getInstance();
private List<MyClass> saveQueue = new ArrayList<MyClass>();
public void process() {
List<X> rawData = getListOfX();
for(X x:rawData) {
processX();
}
saveFoos(saveQueue);
}
public void saveOrUpdateFoos(List<Foo> foos) {
for(MyClass foo:foos) {
MyClass existingFoo = myEJB.getFoosForWidAndDates(foo.getWid(), foo.getEffBeginDt(),foo.getEffEndDt());
if(existingFoo == null) saveQueue.add(foo);
else {
existingFoo.updateIfDifferent(foo);
saveQueue.add(existingFoo);
}
}
if(saveQueue.size() > 5000) {
myEJB.saveObjects(saveQueue);
saveQueue.clear();
}
}
public void processX() {
ArrayList<MyClass> foos = new ArrayList<MyClass>();
if(x.reportPeriod != null && x.gravity != null){
MyClass foo = new MyClass();
foo.setId(null);
foo.setWId(x.getWid());
foo.setEffBeginDt(x.reportPeriod);
foo.setEffEndDt(addOneMonth(x.reportPeriod));
foo.setGravity(x.gravity);
foos.add(foo);
}
saveOrUpdateFoos(foos);
}
}
MyImportEJB.java:
@Stateless
@EJB(name = "MyImportEJB", beanInterface = MyImportEJB.class)
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
@PermitAll
public class MyImportEJB{
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void saveObjects(List<? extends P> mappedObjects)
{
for (P mappedObject : mappedObjects)
{
this.saveObject(mappedObject);
}
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void saveObject(P mappedObject)
{
EntityManager entityManager = this.getEntityManager();
Object identifier = this.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier(mappedObject);
if (identifier != null) {
Object existingObject = entityManager.find(mappedObject.getClass(), identifier);
if (existingObject != null) {
entityManager.merge(mappedObject);
return;
}
}
entityManager.persist(mappedObject);
}
public MyClass getFoosForWidAndDates(Integer wid, Calendar effBeginDt, Calendar effEndDt) {
try {
return (MyClass)((this.entityManager
.createQuery("select M from MyClass M where wid = :wid and effBeginDt = :effBeginDt and effEndDt = :effEndDt ", MyClass.class)
.setParameter("wid",wid)
.setParameter("effBeginDt", effBeginDt)
.setParameter("effEndDt", effEndDt)).getSingleResult());
} catch(NoResultException | NonUniqueResultException e) {
return null;
}
}
}
MyClass.java
public MyClass{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "Id")
private Integer id;
@Column(name = "wid")
private Integer wId;
@Column(name = "eff_begin_dt")
private Calendar effBeginDt;
@Column(name = "eff_end_dt")
private Calendar effEndDt;
@Column(name = "gravity")
private Double gravity;
private Integer dataDownloadId;
public void updateIfDifferent(MyClass other) {
if(other.gravity != null && other.gravity != this.gravity) this.gravity = other.gravity;
//same for effBeginDt andeffEndDt
}
}
persistence.xml
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="ProdData">
<description>ProdData Database Persistence Unit</description>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/ProdDataJNDI</jta-data-source>
<class>path.to.MyClass</class>
<class>path.to.X</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.show_sql" value="false" />
</properties>
</persistence-unit>
</persistence>
अपवाद पर फेंक दिया जाता है कॉलिंग इकाई प्रबंधक .persिस्ट (मैप edObject) < - MyImportEJB.saveObject < -MyImportEJB.saveObjects। मेरे पास लाइन नंबर
मैंने एक नमूना प्रोग्राम लिखने का प्रयास किया है जहां मुझे डेटाबेस से मौजूदा Foo ऑब्जेक्ट मिलता है, अपडेट और सहेजता है, क्योंकि यह त्रुटि का सबसे संभावित स्रोत था। लेकिन मैं त्रुटि को पुन: पेश नहीं कर सका। कृपया मदद करे।
संपादित करें:
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List<Integer> getUnprocessedIds(Class<? extends ProductionRawData> clazz, Integer dataDownloadId) {
String canonicalName = clazz.getCanonicalName();
String queryStr = "select id from " + canonicalName + " where datadownloadId = :dataDownloadId and isProcessed != 1";
TypedQuery<Integer> query = this.entityManager.createQuery(queryStr, Integer.class)
.setParameter("dataDownloadId", dataDownloadId);
try {
return query.getResultList();
} catch(NoResultException nre) {
return new ArrayList<T>();
}
}
संपादित करें:
public List<X> getListOfX() {
return myImportEJB.getUnprocessedIds(X.class, 30495);
}
फ़ाइल MyImportEJB.java से
: यहाँ getListofX()
अनुरोध किया MyProcessor.java से की जानकारी दी जा रही इसके अलावा जोड़ा getFoosForWidAndDates() के विवरण। यह मुझे सुझाव दिया गया था कि मैंने आईडी को एक नई फू पर सेट कतार में जोड़ने से पहले शून्य पर सेट किया था। मैं जानना चाहूंगा अगर यह संभव है कि आईडी एक अस्वीकार्य मूल्य
getListOfX() का स्रोत क्या है? क्या आपकी इकाई का किसी अन्य इकाई के साथ कोई संबंध है? मुझे लगता है कि यह प्रश्न एक [डुप्लिकेट] है (http://stackoverflow.com/questions/2441598/detached-entity-passed-to-persist-error-with-jpa-ejb-code), यह आपकी मदद कर सकता है। अन्यथा आपके पास [वह अन्य एक्सचेंज] है (http://stackoverflow.com/questions/6378526/org-hibernate-persistentobjectexception-detached-entity-passed-to-persistist), लेकिन यह आपकी स्थिति में फिट नहीं है। – bdulac
जिस इकाई को मैं सहेज रहा हूं उसके किसी भी अन्य इकाई के साथ कोई संबंध नहीं है –
MyImportEJB.getInstance() कैसे काम करता है? यदि 'MyImportEJB' कंटेनर द्वारा नहीं बनाया गया है तो आपके एनोटेशन द्वारा निहित लेनदेन प्रबंधन सेमेन्टिक्स में से कोई भी प्रभाव नहीं पड़ेगा। तथ्य यह है कि आप [@PersistenceContext] (http://docs.oracle.com/javaee/6/api/javax/persistence/PersistenceContext.html) के साथ EntityManager इंजेक्शन नहीं लग रहे हैं, यह मुझे थोड़ा संदिग्ध बनाता है क्योंकि यह सुझाता है वह इंजेक्शन आपके लिए काम नहीं कर रहा था। –