java - 问题 saveOrUpdate 对象 Hibernate(具有相同标识符 session 的不同对象)

标签 java hibernate session

<分区>

Possible Duplicate:
Hibernate: different object with the same identifier value was already associated with the session

当我想使用 hibernate 更新我的对象到数据库时遇到问题 当我想要更新时(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) 但是当我需要级联时我应该做什么?

最佳答案

org.hibernate.Session.update() 不适用于临时对象 - 它用于更新持久对象。您引用的消息“具有相同标识符值的不同对象已经与 session 相关联”解释了这个问题。您创建了一个全新的对象

BranchEntity be = new BranchEntity();

填写其字段并将其传递给更新。但是更新需要一个与 session 关联的对象。所以你应该使用你的 dao 加载对象,比如

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

关于java - 问题 saveOrUpdate 对象 Hibernate(具有相同标识符 session 的不同对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1192691/

相关文章:

java - 如何在application.properties文件中设置默认值?

java - 如何将参数发送到 Ldap 中的 SocketFactory

Spring OpenentityManagerInViewFilter 替代品

hibernate - Grails 标准的复杂预测

shell - 每当我启动新的 shell session 时,如何使 TMUX 处于事件状态?

java - JTextArea(换行)作为 TableCellRenderer 到多列

hibernate - 当@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 时,为什么@MappedSuperclass 上有相同的Id

ruby-on-rails - Rails - 如何捕获指向应用程序中当前操作的 URL?

session - JWT 和签名 cookie 有什么区别?

java - 如何一次设置所有 Java Swing GUI 组件背景和前景(字体)颜色?