删除ManyToMany链接

时间:2014-06-18 10:33:48

标签: java hibernate jpa spring-data

我是Hibernate的新手,我对此有疑问。

我有3个表:User,Role和UserRole。

用户和角色具有UserRole映射的ManyToMany关系。

我在Role中有两行:(1,ROLE_ADMIN)(2,ROLE_USER)。 我在User中有一行:(1,TESTUSER)。 我在UserRole中有两行:(1,1)(1,2)。

我有2个实体:UserEntity和RoleEntity。

我在UserEntity上的TESTUSER调用方法.add(Role)和Session上的.save(User)之后添加了2个角色。

我可以添加我想要TESTUSER的所有角色,它的确有效!

当我在UserEntity上调用.remove(Role)时,在我的JPA存储库上调用.save(User)之后。它不起作用。

我的意思是hibernate不执行任何查询来删除表UserRole的元素。为什么? 你能救我吗?

RoleEntity

@Entity
@Table(name = "role" , uniqueConstraints= {
    @UniqueConstraint(columnNames={ "role_id" }) ,
    @UniqueConstraint(columnNames={ "name" }) 
})
@Indexed
public 
        class Role
        implements Serializable
{    

    @ManyToMany( mappedBy="roleList", fetch = FetchType.LAZY )
    @Fetch(FetchMode.SELECT)
    @BatchSize(size = 100)
    private List<User> userList = new ArrayList<>(0); 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "role_id", nullable = false)
    private
        Long roleId; 

    @Column(name = "name", nullable = false)
    private
        String name; 

UserEntity

@Entity
@Table(name = "user" , uniqueConstraints= {
    @UniqueConstraint(columnNames={ "user_id" }) ,
    @UniqueConstraint(columnNames={ "name" }) 
})
@Indexed
public 
        class User
        implements Serializable
{    
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "user_role")
    @Fetch(FetchMode.SELECT)
    @BatchSize(size = 100)
    private List<Role> roleList = new ArrayList<>(0); 

    @Column(name = "name", nullable = false)
    private
        String name; 

我的测试代码:

Role adminRole = new RuoloBuilder().setName("ROLE_ADMIN").build();
Role userRole = new RuoloBuilder().setName("ROLE_USER").build();

adminRole = roleService.saveOrUpdate(adminRole);
userRole = roleService.saveOrUpdate(userRole);

User user = new UtenteBuilder()
     .setName("TESTUSER")
     .setRoleList(Arrays.asList(adminRole, userRole))
     .build();
user =  userService.saveOrUpdate(user); // It works
user.getRoleList().remove(userRole);
userService.saveOrUpdate(user); // It doesn't work

1 个答案:

答案 0 :(得分:0)

@ManyToMany(fetch = FetchType.LAZY,cascade=CascadeType.ALL) // on the entity User

您必须将所有操作PERSIST, REMOVE, REFRESH, MERGE, DETACH级联到链接的实体(角色)。