2009-07-28 12 views
12

संभव डुप्लिकेट: जब मैं
Hibernate: different object with the same identifier value was already associated with the sessionसमस्या saveOrUpdate वस्तु हाइबरनेट (एक ही पहचानकर्ता सत्र के साथ एक अलग वस्तु)

मैं जब समस्या है चाहता हूँ का उपयोग कर डेटाबेस के लिए मेरी वस्तु अद्यतन हाइबरनेट अपडेट चाहते हैं (branchDao.update (be); ) यह अपवाद

a different object with the same identifier value was already associated with the session 
से नीचे फेंक गया है

यह मेरा कोड:

  LoginEntity le = loginDao.getSpecificLogin(pkId); 
      le.setPassword(password); 
      le.setRoles(role); 
      loginDao.update(le);    
      HumanEntity he = humanDao.getHumanById(humanID); // humanEntuty farde morede nazar ro bar hasbe Email taraf load mikonad 
      he.setHumanEmail(oemail); 
      he.setHumanFamily(olname); 
      he.setHumanName(ofname); 
      humanDao.update(he); 
      superBranchUsername = branch.getFatherUsername(); 
      int superBranchId = branchDao.getBranchIdByUserName(superBranchUsername); 
      BranchEntity superBranch = branchDao.load(superBranchId); 
      BranchEntity be = new BranchEntity(); 
      setBranchEntity(be, he, pkId, bname, confirmed, level, studentCount, uname, superBranch, le); 
      branchDao.update(be); //this line throw exception 

और अद्यतन के लिए:

public void update(T transientObject) throws DatabaseException { 
     Session s = HibernateUtil.getSession(); 
     Transaction tx = null; 
     try { 
      tx = s.beginTransaction(); 
      s.update(transientObject); 
      s.flush(); 
      tx.commit(); 
     } catch (HibernateException e) { 
      System.out.println(e.getMessage()); 
      tx.rollback(); 
      e.printStackTrace(); 

      throw new DatabaseException("cant't update object"); 
     } 
    } 

और यह मेरा BranchEntity वर्ग

@Entity 
@Table(name = "branch", uniqueConstraints = {@UniqueConstraint(columnNames = {"bname", "branch_fk"})}) 
public class BranchEntity implements Serializable { 

    @Id 
    @GeneratedValue 
    private int id; 
    @Column(name = "username", length = 64, nullable = false) 
    private String userName; 
    @Column(name = "bname", length = 64) 
    private String branchName; 
    @Column(name = "studcount") 
    private int studCount; 
    @Column(name = "blevel", columnDefinition = "int default 0") 
    private int level; 
    @Column(name = "confirmed", columnDefinition = "tinyint default 0") 
    private int confirmed; 
    @OneToMany(mappedBy = "branch", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
    private Set<BranchBuildingEntity> branchbuilding = new HashSet<BranchBuildingEntity>(); 
    @OneToMany(mappedBy = "branch", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
    private Set<BranchPictureEntity> branchPicture = new HashSet<BranchPictureEntity>(); 
    @OneToOne(fetch = FetchType.EAGER)  
    @JoinColumn(name = "login_fk", nullable = true) 
    private LoginEntity login; 
    @OneToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "human_fk", nullable = true) 
    private HumanEntity human;   
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinColumn(name = "branch_fk", referencedColumnName = "id", nullable = true) 
    private BranchEntity superBranch; 

कुछ जहां मुझे लगता है कि समस्या को पढ़ क्योंकि मैं @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) का उपयोग लेकिन क्या shoud जब मुझे कैस्केड चाहिए तो मैं करता हूं?

उत्तर

14

org.hibernate.Session.update() क्षणिक वस्तुओं के लिए नहीं है - यह लगातार वस्तुओं को अद्यतन करने के लिए है। संदेश बताता है कि "एक ही पहचानकर्ता मान के साथ एक अलग वस्तु पहले ही सत्र से जुड़ी हुई थी" समस्या बताती है। आप एक ब्रांड नई ऑब्जेक्ट

BranchEntity be = new BranchEntity(); 

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

BranchEntity be = branchDao.loadBranchEntity(...); 
+0

या यदि आप वास्तव में एक नई वस्तु बनाना चाहते हैं तो सहेजें/saveOrUpdate का उपयोग करना चाहिए। –

संबंधित मुद्दे