posts - 431,  comments - 344,  trackbacks - 0
今天同事问了一个问题,关于annotation配置多对多关联映射以后,创建新的对象时候,为什么多对多的关系没有保存到关系表中。具体问题如下:
当前有一个User和一个Role,它们是多对多关系,中间表为user_role存放user和role的id。部分User代码如下:
@ManyToMany(cascade = { CascadeType.PERSIST }, fetch = FetchType.LAZY)   
    @JoinTable(name = "user_role",
      joinColumns = @JoinColumn(name = "user_id"),
      inverseJoinColumns = @JoinColumn(name = "role_id"))    

 public Set<Role> getRoles() {
  return roles;
 }
 
 public void setRoles(Set<Role> roles) {
  this.roles = roles;
 }
 
 public void addRole(Role role) {
  if (!this.roles.contains(role)) {
   this.roles.add(role);
  }
 }
 
 public void removeRole(Role role) {
  this.roles.remove(role);
 }

Role中的部分代码如下:
@ManyToMany(
   cascade = {CascadeType.PERSIST, CascadeType.MERGE},
   mappedBy = "roles",
   targetEntity = User.class
   )

 public Set<User> getUsers() {
  return users;
 }

而测试代码继承了AbstractTransactionalJUnit4SpringContextTests,代码如下:
 @Test
 public void testManyToMany() {
  Role oneRole = new Role();
  oneRole.setDescription("manager");
  oneRole.setEnabled(true);
  oneRole.setRoleName("manger");
  
  Role twoRole = new Role();
  twoRole.setDescription("waitress");
  twoRole.setEnabled(true);
  twoRole.setRoleName("waitress");
  
  User user = new User();
  user.setEnabled(true);
  user.setPassword("jianghaiying");
  user.setUsername("Jiang HaiYing");
  user.addRole(oneRole);
  user.addRole(twoRole);
  userDAO.persist(user);
  
  try {
   userDAO.getConnection().commit();
  } catch (SQLException e) {
   e.printStackTrace();
  }
 }
这样执行以后,打印出的信息如下:
Hibernate: insert into user (enabled, password, username) values (?, ?, ?)
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)

这时候问题出来了,为什么没有往关系表中插入数据?
其实这并不是代码或者配置写错误了,在正式运行代码一切正常,而是AbstractTransactionalJUnit4SpringContextTests出的鬼,事实上多对多关联关系是由Hibernate去帮我们维护的,而AbstractTransactionalJUnit4SpringContextTests为了保持数据的清洁又会自动回滚。如何解决这个问题呢?
方法:
只需要在test方法上添加@Rollback(false),不让它回滚,一切正常了。这时候也可以去掉try语句了。
Hibernate: insert into user (enabled, password, username) values (?, ?, ?)
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)
Hibernate: insert into user_role (user_id, role_id) values (?, ?)
Hibernate: insert into user_role (user_id, role_id) values (?, ?)
posted on 2009-11-04 20:58 周锐 阅读(4580) 评论(1)  编辑  收藏 所属分类: HibernateJunitSpring

只有注册用户登录后才能发表评论。


网站导航: