gpt4 book ai didi

Hibernate更新后从多对多关联表中删除记录

转载 作者:行者123 更新时间:2023-12-02 05:23:26 25 4
gpt4 key购买 nike

在我面向团队合作的应用程序中,用户和团队之间存在多对多关系,因此 hibernate 会创建关联表。问题是,在更新拥有团队的用户后,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

这是日志:

INFO: 20.11.2012 22:50:00,170 DEBUG org.hibernate.transaction.JDBCTransaction.begin: begin
INFO: 20.11.2012 22:50:00,175 DEBUG org.hibernate.transaction.JDBCTransaction.begin: current autocommit status: true
INFO: 20.11.2012 22:50:00,175 DEBUG org.hibernate.transaction.JDBCTransaction.begin: disabling autocommit
INFO: 20.11.2012 22:50:00,175 DEBUG hibernate.jdbc.util.SQLStatementLogger.logStatement: select user_.EMAIL, user_.GROUPNAME as GROUPNAME0_, user_.NAME as NAME0_, user_.PASSWORD as PASSWORD0_ from USERS user_ where user_.EMAIL=?
INFO: Hibernate: select user_.EMAIL, user_.GROUPNAME as GROUPNAME0_, user_.NAME as NAME0_, user_.PASSWORD as PASSWORD0_ from USERS user_ where user_.EMAIL=?
INFO: 20.11.2012 22:50:00,176 TRACE type.descriptor.sql.BasicBinder.bind: binding parameter [1] as [VARCHAR] - a@b.com
INFO: 20.11.2012 22:50:00,177 TRACE type.descriptor.sql.BasicExtractor.extract: found [users] as column [GROUPNAME0_]
INFO: 20.11.2012 22:50:00,178 TRACE type.descriptor.sql.BasicExtractor.extract: found [default] as column [NAME0_]
INFO: 20.11.2012 22:50:00,178 TRACE type.descriptor.sql.BasicExtractor.extract: found [default] as column [PASSWORD0_]
INFO: 20.11.2012 22:50:00,251 DEBUG org.hibernate.transaction.JDBCTransaction.commit: commit
INFO: 20.11.2012 22:50:00,252 DEBUG hibernate.jdbc.util.SQLStatementLogger.logStatement: update USERS set GROUPNAME=?, NAME=?, PASSWORD=? where EMAIL=?
INFO: Hibernate: update USERS set GROUPNAME=?, NAME=?, PASSWORD=? where EMAIL=?
INFO: 20.11.2012 22:50:00,260 TRACE type.descriptor.sql.BasicBinder.bind: binding parameter [1] as [VARCHAR] - users
INFO: 20.11.2012 22:50:00,261 TRACE type.descriptor.sql.BasicBinder.bind: binding parameter [2] as [VARCHAR] - andy
INFO: 20.11.2012 22:50:00,261 TRACE type.descriptor.sql.BasicBinder.bind: binding parameter [3] as [VARCHAR] - break
INFO: 20.11.2012 22:50:00,262 TRACE type.descriptor.sql.BasicBinder.bind: binding parameter [4] as [VARCHAR] - a@b.com
INFO: 20.11.2012 22:50:00,264 DEBUG hibernate.jdbc.util.SQLStatementLogger.logStatement: delete from USER_TEAM where EMAIL=?
INFO: Hibernate: delete from USER_TEAM where EMAIL=?
INFO: 20.11.2012 22:50:00,271 TRACE type.descriptor.sql.BasicBinder.bind: binding parameter [1] as [VARCHAR] - a@b.com

INFO: 20.11.2012 22:50:00,274 DEBUG
org.hibernate.transaction.JDBCTransaction.toggleAutoCommit: re-enabling autocommit INFO: 20.11.2012 22:50:00,274 DEBUG org.hibernate.transaction.JDBCTransaction.commit: committed JDBC Connection

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

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

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

DAO 方法只是在事务中由 spring 服务 bean UserServiceImpl 调用:

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


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

感谢任何建议或解释。

最佳答案

您无需任何级联即可实现此目的。给定用户的连接表的内容由该用户的 teamList 集合的内容决定。因此,如果您使用团队列表为空的用户调用 saveOrUpdate(),Hibernate 将删除该用户的连接表的内容。

关于Hibernate更新后从多对多关联表中删除记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13483357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com