2009-07-28 40 views
12

thể trùng lặp:
Hibernate: different object with the same identifier value was already associated with the sessionvấn đề saveOrUpdate đối tượng Hibernate (một đối tượng khác nhau với phiên định danh tương tự)

Tôi có vấn đề khi muốn cập nhật đối tượng của tôi để cơ sở dữ liệu sử dụng ngủ đông khi tôi muốn cập nhật (branchDao.update (be); ) nó ném bên dưới ngoại lệ

a different object with the same identifier value was already associated with the session 

mã này của tôi:

  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 

và cho update:

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"); 
     } 
    } 

và lớp này BranchEntity tôi

@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; 

Một số nơi tôi đọc vấn đề đó vì sử dụng @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) nhưng những gì shoud Tôi làm gì khi tôi cần thác?

Trả lời

14

org.hibernate.Session.update() không dành cho các đối tượng tạm thời - đó là để cập nhật các đối tượng liên tục. Thư bạn trích dẫn "một đối tượng khác có cùng giá trị số nhận dạng đã được liên kết với phiên" giải thích sự cố. Bạn tạo một đối tượng hoàn toàn mới

BranchEntity be = new BranchEntity(); 

điền vào các trường và chuyển nó để cập nhật. Nhưng cập nhật dự kiến ​​một đối tượng được liên kết với phiên. Vì vậy, bạn nên tải đối tượng bằng dao của mình, chẳng hạn như

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

hoặc bạn nên sử dụng save/saveOrUpdate nếu bạn thực sự muốn tạo đối tượng mới. –

Các vấn đề liên quan