2011-04-12 22 views
6

मैं एकToMany रिश्ते में एक इकाई को कैसे हटा सकता हूं।जेपीए 2.0: वनटॉनी रिलेशनशिप में एंटीटी हटाएं

@Entity 
@NamedQueries({ 
    @NamedQuery(name="User.findByUserNamePassword", 
    query="select c from User c where c.userName = :userName AND c.password = :password") 
}) 
@Table(name="\"USER\"") 
public class User implements Serializable { 
    @OneToMany(mappedBy="user", cascade=CascadeType.ALL, orphanRemove=true) 
    private List<Profession> professions; 

    public List<Profession> getProfessions() { 
     return professions; 
    } 

    public void setProfessions(List<Profession> professions) { 
     this.professions = professions; 
    } 

    public void addProfession(Profession profession){ 
     if(this.professions == null){ 
      this.professions = new ArrayList<Profession>(); 
     } 
     this.professions.add(profession); 
     profession.setUser(this); 
    } 

    public void removeProfession(Profession profession){ 
     if(this.professions != null){ 
      professions.remove(profession); 
      profession.setUser(null); 
     } 
    } 
} 

अंदर पेशे इकाई

@Entity 
public class Profession implements Serializable { 
    @ManyToOne 
    @JoinColumn(name="UserId", nullable=false) 
    private User user; 

    public User getUser() { 
     return user; 
    } 

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

तब मेरे EJB के अंदर मैं खूबसूरती से इस

@Stateless 
@LocalBean 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class ScholarEJB{ 

    /** 
    * Add a profession to a target user 
    * @param user 
    * @param profession 
    */ 
    public void addProfession(User user, Profession profession){ 
     //Put the user in a managed state. It is important to do this before 
     //adding a new profession onto user 
     user = find(User.class, user.getId()); 
     user.addProfession(profession); 
     this.create(user); //This is persist action 
    } 

    public void removeProfession(User user, Profession profession){ 
     //Put the user in a managed state. It is important to do this before 
     //adding a new profession onto user 
     user = find(User.class, user.getId()); 
     user.remove(user); 
     this.update(user); //merge action 
     //this.create(user) //also try this as well, but it does not work 
    } 
} 

अब addProfession काम है, लेकिन removeProfession काम नहीं करता। यकीन नहीं है कि क्यों? कृपया मदद करें। क्या मुझे कैशों को बेदखल करने की ज़रूरत है?

+0

अपने oneToMany संबंध में, सही एनोटेशन orphanRemoval = सच है, orphanRemove = सच – greuze

उत्तर

1

आप पेशे में उपयोगकर्ता क्षेत्र साफ़ करने का प्रयास हो सकता है:

public void removeProfession(Profession profession){ 
     if(this.professions != null){ 
      professions.remove(profession); 
      profession.setUser(null); // disassociate profession from user 
     } 
    } 

सुरक्षित पक्ष पर होना करने के लिए सिर्फ मामले में किसी को एक पेशे में गुजरता है, मैं भी जांच करेगा कि पेशे के वर्तमान उपयोगकर्ता में पारित this बराबर होती है, किसी अन्य उपयोगकर्ता से संबंधित है।

+0

नहीं की कोशिश है कि रूप में अच्छी तरह से काम नहीं बनता। मैं हटाए जाने के बाद पेशे की सूची मुद्रित करता हूं और इससे पहले कि मैं लगातार/विलय करता हूं, सूची वापस आती है। लेकिन जब मैं लगातार/विलय करता हूं, यह मेरे डेटाबेस –

9

यदि व्यवसाय केवल इस संबंध का हिस्सा हैं, तो आप गारंटी दे सकते हैं कि जब उपयोगकर्ता के सेट से एक पेशे हटा दिया जाता है तो इसे रिश्ते के वनटोननी पक्ष पर अनाथ रिमूवल चालू करके डेटाबेस से हटा दिया जाएगा।

@OneToMany(mappedBy="user", cascade=CascadeType.ALL, orphanRemoval=true) 
private List<Profession> professions; 

यह वही है जेपीए 2.0 विनिर्देश राज्यों

जेपीए 2.0 विनिर्देश कहा गया है कि

संघों कि के रूप में OneToOne या orphanRemoval विकल्प की OneToMany समर्थन उपयोग निर्दिष्ट कर रहे हैं। निम्नलिखित व्यवहार लागू होते हैं जब orphanRemoval प्रभाव में है:

एक इकाई संबंध का लक्ष्य है कि (संबंध से शून्य पर सम्बन्ध स्थापित करते या इकाई को हटाने के द्वारा रिश्ते से हटा दिया जाता है संग्रह), निकालना ऑपरेशन अनाथ होने पर इकाई पर लागू होगा। निकालना ऑपरेशन फ्लश ऑपरेशन के समय लागू होता है। अनाथ रिमूवल कार्यक्षमता इकाइयों के लिए है जो निजी रूप से " मूल इकाई द्वारा" स्वामित्व "हैं। पोर्टेबल अनुप्रयोग अन्यथा निष्कासन के विशिष्ट क्रम पर निर्भर नहीं होना चाहिए, और किसी अन्य रिश्ते या पर अनाथ किसी अन्य इकाई को पुन: असाइन नहीं करना चाहिए अन्यथा इसे जारी रखने का प्रयास करना चाहिए। यदि अनाथ होने वाली इकाई अलग, नई, या हटाई गई इकाई है, तो अनाथ रिमूवल के अर्थशास्त्र लागू नहीं होते हैं।

निकालें 'संचालन किसी प्रबंधित स्रोत इकाई लागू किया जाता है, तो निकालें आपरेशन अनुभाग 3.2 के नियमों के अनुसार संबंध लक्षित करने के लिए सोपानी कर दिया जाएगा।3, (और इसलिए कैस्केड = संबंधों के लिए हटाने के लिए निर्दिष्ट नहीं है) [20]।

+1

के अंदर प्रतिबिंबित नहीं होता है दुख की बात है कि मैं इसे आजमाता हूं, लेकिन अभी भी काम नहीं करता है। लेकिन मुझे पता है कि क्या काम करता है। काम करने के लिए मुझे दूसरे स्तर के कैश को साफ़ करना होगा। 'पेशे = em.merge (पेशे); em.remove (पेशा); em.getEntityManagerFactory()। getCache() evictAll(); ', यह काम, लेकिन मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका है –

+0

क्या आपकी पोस्ट आपकी अपडेट विधि क्या कर सकती है? यह कहता है कि यह एक विलय करता है, जो आपके वर्तमान कोड में स्पष्ट या स्पष्ट नहीं है। –

+0

मैं अपना कोड दोबारा पोस्ट करता हूं। कृपया इसे –

1

यह, मेरी मूल प्रश्न का हल है हालांकि, मैं अगर यह मेरी प्रबंधित बीन में अब सबसे अच्छा

मेरे EJB सेम

@PersistenceContext(unitName="Bridgeye2-ejbPU") 
private EntityManager em; 

public <T> T create(T t) { 
    em.persist(t); 
    return t; 
} 

public <T> T find(Class<T> type, Object id) { 
    return em.find(type, id); 
} 

public <T> void delete(T t) { 
    t = em.merge(t); 
    em.remove(t); 
} 

public <T> void removeAndClearCaches(T t){ 
    this.delete(t); 
    clearCaches(); 
} 

public <T> T update(T t) { 
    return em.merge(t);  

है पता नहीं है, मैं इस

करना
/** 
* Add a new profession 
*/ 
public void addNewProfession(){ 
    Profession profession = new Profession();   
    newProfessions.add(profession);   
} 

/** 
* Remove the profession 
* @param profession 
*/ 
public void removeProfession(Profession profession){ 
    //This will remove the `profession` of the list 
    //at the presentation layer 
    this.myProfessions.remove(profession); 
    //This will remove the `profession` of the list 
    //at the persistence layer 
    scholarEJB.removeAndClearCaches(profession); 
} 
4

मेरा अनुमान है कि क्या हो रहा है यह है कि आपके उपयोगकर्ता के पास पेशे के लिए एक बहुत ही रिश्ते है और आप उपयोगकर्ता ऑब्जेक्ट पेशे हैं। जब आप पेशे को हटाते हैं तो उपयोगकर्ता के पास अभी भी संदर्भ है। चूंकि मैपिंग कैस्केड बनी रहती है, फिर भी यह पेशे को बरकरार रखती है।

आपको यह सुनिश्चित करने की आवश्यकता है कि आप इसे हटाने से पहले उपयोगकर्ता के व्यवसाय से पेशे को हटा दें।

यदि आप एक्लिप्ससेंक का उपयोग कर रहे हैं तो ऐसी संपत्ति भी है जो आपकी मदद कर सकती है, लेकिन अपने मॉडल को सही तरीके से बनाए रखने के लिए अपने कोड को ठीक करना सबसे अच्छा समाधान है। आप कैस्केड को भी हटा सकते हैं।

"eclipselink.persistence-context.persist-ऑन-प्रतिबद्ध" = "false"

या, "eclipselink.persistence-context.commit-बिना-जारी रहती है-नियम" = "true"

0

मैंने अभी OneToMany रिश्ते में orphanRemoval = true जोड़ा और मैंने इसे हल किया।

कक्षा SolicitudRetorno:

@OneToMany(mappedBy = "solicitud", cascade = CascadeType.ALL, orphanRemoval = true) 
@LazyCollection(LazyCollectionOption.FALSE) 
@NotAudited 
private List<RetornoMenor> hijosRetorno; 

कक्षा RetornoMenor:

@OneToMany(mappedBy = "solicitud", cascade = CascadeType.ALL, orphanRemoval = true) 
@LazyCollection(LazyCollectionOption.FALSE) 
@NotAudited 
private List<RetornoMenor> hijosRetorno;