2011-02-05 20 views
6

मैं हाइबरनेट में एक जेपीए इंटरफ़ेस का उपयोग कर रहा हूं, और मैंने डेटाबेस से किसी इकाई को लोड करने के लिए कुछ सरल कोड लिखा है और फिर इसे हटाएं (हटाएं)। इकाइयों को सम्मिलित करने और अपडेट करने के लिए मेरे सभी विलय कॉल पूरी तरह से काम कर रहे हैं, लेकिन जब मैं किसी इकाई को निकालने का प्रयास करता हूं, तो हाइबरनेट डेटाबेस से इसे हटा नहीं देता है, और कोई अपवाद नहीं फेंक दिया जाता है।जेपीए/हाइबरनेट हटाएं इकाई

प्राथमिक विधि:

/** 
* Accept an invite that was sent to you. 
* 
* @param inviteId 
* @return XML model of the EventMember. 
*/ 
@RequestMapping(value="/invites/accept.rest") 
public ModelAndView acceptInvite(@RequestParam final long inviteId) { 
    final EventInvite invite = eventInviteDAO.find(EventInvite.class, eventInviteId); 

    EventMember eventMember = new EventMember(); 
    eventMember.setEvent(invite.getEvent()); 
    eventMember.setUser(invite.getUser()); 
    eventMember = eventMemberDAO.store(eventMember); 

    eventInviteDAO.remove(invite); 

    return getXMLModelAndView("eventMember", eventMember); 
} 

AbstractJpaDao वर्ग (सभी डीएओ वर्गों द्वारा विरासत में मिली):

public abstract class AbstractJpaDao<T> implements JpaDao<T> { 
    abstract public EntityManager getEntityManager(); 

    public <T> T find(Class<T> entityClass, Object primaryKey) { 
     return getEntityManager().find(entityClass, primaryKey); 
    } 

    @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED) 
    public T store(final T objectToPersist) { 
     T result = getEntityManager().merge(objectToPersist); 
     return result; 
    } 

    @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED) 
    public void remove(final T objectToDelete) { 
     getEntityManager().remove(objectToDelete); 
    } 
} 

EventInvite डोमेन वर्ग:

@Entity 
@Table(name = "TEventInvite") 
public class EventInvite implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Column(name = "EventInviteID", nullable = false) 
    @Basic(fetch = FetchType.EAGER) 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long eventInviteId; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumns({ @JoinColumn(name = "EventID", referencedColumnName = "EventID", nullable = false) }) 
    private Event event; 

    @Column(name = "Email") 
    @Basic(fetch = FetchType.EAGER) 
    private String email; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "CreateDate", nullable = false) 
    @Basic(fetch = FetchType.EAGER) 
    private Calendar createDate; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumns({ @JoinColumn(name = "UserID", referencedColumnName = "UserID") }) 
    private User user; 

    public void setEventInviteId(long eventInviteId) { 
     this.eventInviteId = eventInviteId; 
    } 

    public long getEventInviteId() { 
     return this.eventInviteId; 
    } 

    public Event getEvent() { 
     return event; 
    } 

    public void setEvent(Event event) { 
     this.event = event; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getEmail() { 
     return this.email; 
    } 

    public void setCreateDate(Calendar createDate) { 
     this.createDate = createDate; 
    } 

    public Calendar getCreateDate() { 
     return this.createDate; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    public User getUser() { 
     return user; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result 
       + ((createDate == null) ? 0 : createDate.hashCode()); 
     result = prime * result + ((email == null) ? 0 : email.hashCode()); 
     result = prime * result + ((event == null) ? 0 : event.hashCode()); 
     result = prime * result + ((user == null) ? 0 : user.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     EventInvite other = (EventInvite) obj; 
     if (createDate == null) { 
      if (other.createDate != null) 
       return false; 
     } else if (!createDate.equals(other.createDate)) 
      return false; 
     if (email == null) { 
      if (other.email != null) 
       return false; 
     } else if (!email.equals(other.email)) 
      return false; 
     if (event == null) { 
      if (other.event != null) 
       return false; 
     } else if (!event.equals(other.event)) 
      return false; 
     if (user == null) { 
      if (other.user != null) 
       return false; 
     } else if (!user.equals(other.user)) 
      return false; 
     return true; 
    } 

} 
मैं नीचे प्रासंगिक कोड को शामिल किया है

समस्या के बारे में कोई विचार या यह कैसे डिबग करना है?

+0

अपने कोड को अपने 'AbstractJpaDao' के बाद से भ्रामक है और' eventMemberDAO' वास्तव में कर रहे नहीं * डीएओ * रों लेकिन * EntityManager आवरण * रों (या यदि आप ऐसा * दाओएमग्र * एस) होगा। यह अच्छा होगा अगर आप इसे ऊपर अपने उदाहरण में सही करेंगे क्योंकि यह अनावश्यक रूप से समस्या की समझ को जटिल बनाता है। –

उत्तर

3

क्या यह भ्रमित हो रहा है क्योंकि EventInvite लेनदेन सीमा पार करता है? आप इकाई को एक लेनदेन में लोड करते हैं और इसे दूसरे में हटा देते हैं।

इसके बजाय, एक नया @Transactional विधि बनाएं जिसमें आमंत्रण स्वीकार करने के लिए पूर्ण व्यावसायिक तर्क शामिल है क्योंकि यह एक ही लॉजिकल ऑपरेशन है। ऐसा करने से आप प्रस्तुति परत को मॉडल से अलग कर देंगे जब आप एसएमएस या ईमेल के माध्यम से आमंत्रण स्वीकार करना सक्षम करना चाहते हैं।

+0

आप एक प्रतिभाशाली हैं। पूरी तरह से काम किया, डेविड धन्यवाद! – Templar

0

हाय लिए हाइबरनेट आप निष्पादित एसक्यूएल के देखने के लिए

<property name="hibernate.show.sql" value="true"></property> 

की स्थापना मैं क्या संदेह है कि जब आप हटाते हैं, तो किसी भी तरह सत्र या लेन-देन तो हाइबरनेट नहीं होगा फ्लश बंद नहीं है है से कोशिश कर सकते हैं और परिणाम होगा डेटाबेस में नहीं देखा जाना चाहिए।

+1

मैंने जेडीबीसी क्वेरी लॉगिंग चालू कर दी है और हाइबरनेट रिकॉर्ड को हटाने का भी प्रयास नहीं कर रहा है। साथ ही, निकालें कॉल से पहले ईवेंट मेम्बरडाओ.स्टोर कॉल जारी रखा जा रहा है, इसलिए मुझे नहीं लगता कि यह एक लेनदेन मुद्दा है। – Templar

3

मुझे एक ही समस्या थी, मेरे पास एक कक्षा थी जो एक श्रेणी का एक हिस्सा है जो एक मूल्य का वर्णन करती है। इसलिए मूल्य वर्ग में इस श्रेणी का संदर्भ है कि यह एक हिस्सा है।

@Entity 
public class CategoryValue extends LouhinObject implements Serializable, Idable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @ManyToOne 
    private Category category; 
} 

मैं मैन्युअल रूप से इससे पहले कि मैं CategoryValue वस्तु को निकालने के लिए, मैं वास्तव में नहीं जानता कि क्यों हाइबरनेट इस तरह से काम करता है में सक्षम था शून्य पर श्रेणी क्षेत्र स्थापित करने के लिए किया था।

+0

वह लापता लिंक था जिसकी मुझे आवश्यकता थी :-) –

1

मुझे एक ही समस्या थी। मेरी इकाई कार्ड है (नीचे देखें)। और मैं किसी खाते और क्लाइंट को शून्य नहीं कर सका, क्योंकि मेरे पास डेटाबेस में शून्य-शून्य जांच नहीं है।

public class Card implements Serializable { 
    @ManyToOne 
    @JoinColumn(name="idAcc") 
    private Account account; 
    @ManyToOne 
    @JoinColumn(name="idCl") 
    private Client client; 

और जब मैं इसे नष्ट करने के लिए tryed मैं भी हटाने के बारे में एसक्यूएल-अनुरोध नहीं देखा।

em = getEntityManager(); 
    em.getTransaction().begin(); 
    mergedCard = em.merge(card); 
    em.remove(mergedCard); 
    em.getTransaction().commit(); 

तो मैं एनोटेशन द्वारा इस का समाधान

@ManyToOne(cascade=CascadeType.MERGE) 
@JoinColumn(name="idAcc") 
private Account account; 
@ManyToOne(cascade=CascadeType.MERGE) 
@JoinColumn(name="idCl") 
private Client client; 
संबंधित मुद्दे