jpa java.lang.IllegalArgumentException: एक अलग उदाहरण com.test.User#5 को हटा रहा है




sql-delete entitymanager (4)

कभी-कभी इसकी वजह यह होती है कि आप जोड़ने, निकालने, अपडेट ऑपरेशन के लिए @ ट्रांज़ेक्शन एनोटेशन खो रहे हैं।

मेरे पास जेपीए (लेनदेन-प्रकार = "जेटीए") का उपयोग करके जावा ईई प्रोजेक्ट है, जो प्रदाता के रूप में हाइबरनेट है। मैं सीआरयूडी चीजों को संभालने के लिए अपने सेम लिखता हूं। कार्यक्रम जेबीएसएस 7 एएस में चल रहा है।

मेरे पास EntityManagerDAO है:

@Stateful
public class EntityManagerDao implements Serializable {

    @PersistenceContext(unitName = "dtdJpa")
    private EntityManager entityManager;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public Object updateObject(Object object) {
        object = entityManager.merge(object);
        return object;
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void createObject(Object object) {
        entityManager.persist(object);
    }

    public void refresh(Object object) {
        entityManager.refresh(object);
    }

    public <T> T find(Class<T> clazz, Long id) {
        return entityManager.find(clazz, id);
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void deleteObject(Object object) {
        entityManager.remove(object);
    }
}

लेकिन जब मैं deleteObject आह्वान करता deleteObject , तो यह अपवाद आता है।

java.lang.IllegalArgumentException: एक अलग उदाहरण com.test.User # 5 को हटा रहा है

यह कैसे होता है और मैं इसे कैसे हल कर सकता हूं?


मेरे मामले में, मुझे एक ही त्रुटि मिली, जब मैंने किसी ऑब्जेक्ट को हटाने का प्रयास किया,

session.delete(obj)

इससे पहले कि कोई लेनदेन तैयार किए बिना।

और समस्या पहले लेनदेन बनाकर हल की जाती है (session.beginTransaction () और फिर ऑब्जेक्ट को हटा दें।

मुझे उम्मीद है कि मेरा जवाब किसी की मदद करेगा :)


EntityManager#remove() केवल उन संस्थाओं पर काम करता है जो वर्तमान लेनदेन / संदर्भ में प्रबंधित होते हैं। आपके मामले में, आप पहले के लेनदेन में इकाई को पुनर्प्राप्त कर रहे हैं, इसे HTTP सत्र में संग्रहीत कर रहे हैं और फिर इसे किसी भिन्न लेनदेन / संदर्भ में निकालने का प्रयास कर रहे हैं। यह सिर्फ काम नहीं करेगा।

आपको यह जांचने की आवश्यकता है कि इकाई EntityManager#contains() द्वारा प्रबंधित की गई है EntityManager#contains() और यदि नहीं, तो इसे प्रबंधित करें EntityManager#merge()

असल में, आपकी व्यावसायिक सेवा कक्षा की delete() विधि इस तरह दिखनी चाहिए:

em.remove(em.contains(entity) ? entity : em.merge(entity));

मुझे एक ही समस्या का सामना करना पड़ा। अलग इकाई को फिर से संलग्न किया जाना चाहिए। जैसा कि @ बालुससी ने उल्लेख किया है, EntityManager.merge() का उपयोग करके पृथक इकाई को संलग्न करने के लिए उपयोग किया जाना चाहिए। EntityManager.merge() SQL क्वेरी उत्पन्न करता है जो इकाई की वर्तमान स्थिति प्राप्त करता है, जिस पर EntityManager.remove() को निष्पादित किया जाना है। लेकिन मेरे मामले में यह काम नहीं किया। इसके बजाय EntityManager.remove(EntityManager.find(Class<T>,arg)) आज़माएं। यह मेरे लिए काम किया।





illegalargumentexception