Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 问题saveOrUpdate对象休眠(具有相同标识符会话的不同对象)_Java_Hibernate_Session - Fatal编程技术网

Java 问题saveOrUpdate对象休眠(具有相同标识符会话的不同对象)

Java 问题saveOrUpdate对象休眠(具有相同标识符会话的不同对象),java,hibernate,session,Java,Hibernate,Session,可能重复: 当我想使用hibernate将我的对象更新到数据库时出现问题 当我需要更新时(branchDao.update(be); )这是一个例外 a different object with the same identifier value was already associated with the session 这是我的代码: LoginEntity le = loginDao.getSpecificLogin(pkId); l

可能重复:

当我想使用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");
        }
    }
这是我的小班

@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;
@实体
@表(name=“branch”,uniqueConstraints={@UniqueConstraint(columnNames={“bname”,“branch_fk”})})
公共类BranchEntity实现了可序列化{
@身份证
@生成值
私有int-id;
@列(name=“username”,长度=64,可空=false)
私有字符串用户名;
@列(name=“bname”,长度=64)
私有字符串分支名称;
@列(name=“studcount”)
私人国际学生人数;
@列(name=“blevel”,columnDefinition=“int default 0”)
私有整数级;
@列(name=“已确认”,columnDefinition=“tinyint默认值0”)
私人int确认;
@OneToMany(mappedBy=“branch”,fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@OnDelete(action=OnDeleteAction.CASCADE)
@Cascade(org.hibernate.annotations.CascadeType.DELETE\u孤儿)
私有集branchbuilding=newHashSet();
@OneToMany(mappedBy=“branch”,fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@OnDelete(action=OnDeleteAction.CASCADE)
@Cascade(org.hibernate.annotations.CascadeType.DELETE\u孤儿)
private Set branchPicture=new HashSet();
@OneToOne(fetch=FetchType.EAGER)
@JoinColumn(name=“login\u fk”,nullable=true)
私有登录;
@OneToOne(fetch=FetchType.EAGER)
@JoinColumn(name=“human_fk”,nullable=true)
私人人性实体人性;
@manytone(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@JoinColumn(name=“branch\u fk”,referencedColumnName=“id”,nullable=true)
私人分支机构超级分支机构;

有些地方我读到了这个问题,因为我使用了
@Cascade(org.hibernate.annotations.CascadeType.DELETE\u ORPHAN)
,但是当我需要Cascade时我该怎么办?

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

BranchEntity be = new BranchEntity();
填充其字段并将其传递给update。但是update需要一个与会话关联的对象。因此,您应该使用dao加载该对象,如

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

或者,如果确实要创建新对象,则应使用save/saveOrUpdate。