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 को हटा रहा है

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


कभी-कभी आप अलग-अलग उदाहरण से आईडी प्राप्त कर सकते हैं, फिर डेटाबेस पर सीधी क्वेरी का उपयोग करें। उदाहरण के लिए

String petId = pet.getId().toString();
entityManager.createQuery("DELETE FROM Pet pet WHERE id=" + petId).executeUpdate();

आप संदर्भ साफ कर सकते हैं

if (em.contains(pet)){
     em.remove(pet);
}

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


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

session.delete(obj)

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

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

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


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

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

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

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






illegalargumentexception