我是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
答案 0 :(得分:0)
@ManyToMany(fetch = FetchType.LAZY,cascade=CascadeType.ALL) // on the entity User
您必须将所有操作PERSIST, REMOVE, REFRESH, MERGE, DETACH
级联到链接的实体(角色)。