2

在我的面向团队合作的应用程序中,我在用户和团队之间有多对多的关系,所以休眠创建关联表。问题是,在更新拥有 Team 的 User 后,hibernate 会从 USER_TEAM 表中删除相应的关联记录。

用户实体:

@Entity
@Table(name="USERS")
public class User extends SelectItem {

@Id
@Column(name="EMAIL")
private String email;

@Column(name="PASSWORD")
private String password;

@Column(name="NAME")
private String name;

@Column(name="GROUPNAME")
private String group;

@ManyToMany(
    targetEntity=Team.class
)
@ForeignKey(name="FK_TEAM_TO_USER", inverseName = "FK_USER_TO_TEAM")
@JoinTable(
    name="USER_TEAM",
    joinColumns=@JoinColumn(name="EMAIL"),
    inverseJoinColumns=@JoinColumn(name="TEAMNAME")
)
@LazyCollection(LazyCollectionOption.FALSE)
private List<Team> teamList;

@OneToMany(
        fetch = FetchType.EAGER,
        mappedBy="user")
private List<Invitation> invitationList;

//getters setters

团队实体:

@Entity
@Table(name="TEAM")
public class Team extends SelectItem {

@Id
@Column(name="TEAMNAME")
private String name;

@ManyToOne
@ForeignKey(name="FK_TEAM_TO_TEAMLEADER")
@JoinColumn(name="TEAMLEADER")
private User teamLeader;

@ManyToMany(
    mappedBy = "teamList",
    targetEntity = User.class
)
@LazyCollection(LazyCollectionOption.FALSE)
private List<User> memberList;

//getters setters

这是日志:

信息:20.11.2012 22:50:00,170 调试 org.hibernate.transaction.JDBCTransaction.begin:开始
信息:20.11.2012 22:50:00,175 调试 org.hibernate.transaction.JDBCTransaction.begin:当前自动提交状态:true
信息: 20.11.2012 22:50:00,175 调试 org.hibernate.transaction.JDBCTransaction.begin:禁用自动提交
信息:20.11.2012 22:50:00,175 调试 hibernate.jdbc.util.SQLStatementLogger.logStatement:选择 user_.EMAIL,user_.GROUPNAME作为 GROUPNAME0_,user_.NAME 作为 NAME0_,user_.PASSWORD 作为 PASSWORD0_ 来自 USERS user_ where user_.EMAIL=?
信息:休眠:从用户 user_ 中选择 user_.EMAIL,user_.GROUPNAME 作为 GROUPNAME0_,user_.NAME 作为 NAME0_,user_.PASSWORD 作为 PASSWORD0_,其中 user_.EMAIL=?
信息:20.11.2012 22:50:00,176 TRACE type.descriptor.sql.BasicBinder.bind:绑定参数 [1] 作为 [VARCHAR] - a@b.com
信息:20.11.2012 22:50:00,177 TRACE type.descriptor .sql.BasicExtractor.extract:发现 [users] 作为列 [GROUPNAME0_]
信息:20.11.2012 22:50:00,178 TRACE type.descriptor.sql.BasicExtractor.extract:发现 [default] 作为列 [NAME0_]
信息:20.11。 2012 22:50:00,178 TRACE type.descriptor.sql.BasicExtractor.extract:发现 [默认] 作为列 [PASSWORD0_]
信息:20.11.2012 22:50:00,251 调试 org.hibernate.transaction.JDBCTransaction.commit:提交
信息: 20.11.2012 22:50:00,252 调试 hibernate.jdbc.util.SQLStatementLogger.logStatement:更新用户设置 GROUPNAME=?,NAME=?,PASSWORD=? EMAIL=?
信息:休眠:更新用户集 GROUPNAME=?、NAME=?、PASSWORD=? EMAIL=?
信息:20.11.2012 22:50:00,260 TRACE type.descriptor.sql.BasicBinder.bind:绑定参数 [1] 作为 [VARCHAR] - 用户
信息:20.11.2012 22:50:00,261 TRACE type.descriptor.sql.BasicBinder .bind:绑定参数 [2] 作为 [VARCHAR] - andy
INFO:20.11.2012 22:50:00,261 TRACE type.descriptor.sql.BasicBinder.bind:绑定参数 [3] 作为 [VARCHAR] - 中断
信息:20.11。 2012 22:50:00,262 TRACE type.descriptor.sql.BasicBinder.bind:绑定参数 [4] 作为 [VARCHAR] - a@b.com
信息:20.11.2012 22:50:00,264 调试 hibernate.jdbc.util.SQLStatementLogger .logStatement:从 EMAIL=? 的 USER_TEAM 中删除
信息:休眠:从 EMAIL=? 的 USER_TEAM 中删除
信息:20.11.2012 22:50:00,271 TRACE type.descriptor.sql.BasicBinder.bind:绑定参数 [1] 作为 [VARCHAR] - a@b.com

信息:20.11.2012 22:50:00,274 调试
org.hibernate .transaction.JDBCTransaction.toggleAutoCommit:重新启用自动提交信息:20.11.2012 22:50:00,274 DEBUG org.hibernate.transaction.JDBCTransaction.commit:提交的 JDBC 连接

更新操作由spring的hibernateTemplate在UserDAO中这个简单的方法中提供:

public void saveUser(User user){
    hibernateTemplate.saveOrUpdate(user);
}    

(我知道不应该使用 hibernateTemplate,但我认为这不是这个问题的重点)

而DAO方法在事务中被spring service bean UserServiceImpl简单地调用:

@Transactional(readOnly=false)
public void saveUser(User user){
    userDao.saveUser(user);
}


如您所见,我没有任何级联注释,并且在更新中我当然不会更改用户的 PK (EMAIL),所以我不理解这种行为。我正在使用 spring 3.1.0.RELEASE 和休眠 3.6.10.Final。

感谢您的任何建议或解释。

4

1 回答 1

5

你不需要任何级联来实现这一点。给定用户的联接表的内容由teamList该用户的集合的内容决定。因此,如果您saveOrUpdate()使用具有空团队列表的用户调用,Hibernate 将删除该用户的联接表的内容。

于 2012-11-20T22:42:20.213 回答