当对集合进行 get 调用时,Hibernate 会删除延迟加载的多对多集合
Posted
技术标签:
【中文标题】当对集合进行 get 调用时,Hibernate 会删除延迟加载的多对多集合【英文标题】:Hibernate deletes Lazy loaded many-to-many collection when a get call is made on the collection 【发布时间】:2013-07-12 21:54:52 【问题描述】:我正在尝试在 java 应用程序中使用 hibernate 从数据库中获取角色。我正在为此进行多对多映射。
获取数据后,将从数据库中删除。我也没有调用删除方法,删除仍然发生。Role.java
@Entity
@Table(name = "ROLE")
public class Role extends BaseModel implements java.io.Serializable
private Long id;
private Set<User> users = new HashSet<User>(0);
@Id
@Column(name = "ID", unique = true, nullable = false, scale = 0)
public Long getId()
return this.id;
public void setId(Long id)
this.id = id;
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "roles")
@JoinTable(name = "USERROLEMAP", joinColumns = @JoinColumn(name = "ROLEID", nullable = false, updatable = false) , inverseJoinColumns = @JoinColumn(name = "USERID", nullable = false, updatable = false) )
public Set<User> getUsers()
return this.users;
public void setUsers(Set<User> users)
this.users = users;
User.java
@Cacheable
@Entity
@Table(name = "USER", uniqueConstraints = @UniqueConstraint(columnNames = "LOGINID"))
public class User extends BaseModel implements java.io.Serializable
private Long id;
private Set<Role> roles = new HashSet<Role>(0);
@Id
@Column(name = "ID", unique = true, nullable = false, scale = 0)
public Long getId()
return this.id;
public void setId(Long id)
this.id = id;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "USERROLEMAP", joinColumns = @JoinColumn(name = "USERID", nullable = false, updatable = false) , inverseJoinColumns = @JoinColumn(name = "ROLEID", nullable = false, updatable = false) )
public Set<Role> getRoles()
return this.roles;
我们正在尝试使用以下代码 sn-p 从数据库中获取角色
public List<String> rolesAsGA()
List<String> proxyUserRoles = new ArrayList<String>();
Iterator<Role> itr = getRoles().iterator();
while (itr.hasNext())
proxyUserRoles.add(new SimpleGrantedAuthority(itr.next()
.getRoleName()));
return proxyUserRoles;
在获取角色后,数据(对应角色)同时被删除,谁能告诉我为什么?
编辑 - 我们正在 eclipse 中调试,hibernate 正在标记要删除的集合,因为集合实体的 currentPersistor 变为 null。将进一步调试并发布任何更新。
编辑 1 我们没有提到,用户是 @Cacheable,并且正在从 ehcache 中获取,当调用 getRole 时,集合被加载,然后立即排队等待删除。删除 @Cacheable 注释可以解决问题。 我是创建一个关于 @Cacheable 和 manytomany 的单独问题,还是我应该更新这个问题并希望得到一个适当的解决方案?
【问题讨论】:
您在哪里检索数据?他们查询部分? 使用 JPARepository finder 方法检索用户对象。 发布查询详情。 @Thihara,问题似乎是 Ehcache & manytomany 映射问题。 User 对象是从 Ehcache 中获取的,然后当 getRoles 被触发时,数据被获取但随后被标记为删除。去掉@Cacheable注解解决了删除问题。有没有一种方法,我们可以映射用户缓存但稍后延迟加载角色或其他多对多关联? 【参考方案1】:我猜这是导致问题
private Set<Role> roles = new HashSet<Role>(0);
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "USERROLEMAP", joinColumns = @JoinColumn(name = "USERID", nullable = false, updatable = false) , inverseJoinColumns = @JoinColumn(name = "ROLEID", nullable = false, updatable = false) )
public Set<Role> getRoles()
return this.roles;
应该是
private Set<Role> roles;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "USERROLEMAP", joinColumns = @JoinColumn(name = "USERID", nullable = false, updatable = false) , inverseJoinColumns = @JoinColumn(name = "ROLEID", nullable = false, updatable = false) )
public Set<Role> getRoles()
if(roles == null)
return new HashSet<Role>;
return this.roles;
因为每当调用 getRoles 时,它总是会返回一个空集。所以休眠假设您实际上已经清空/删除了集合并在数据库中删除它们
【讨论】:
不一定。角色只会被初始化一次。在类创建时间。之后它不会重新初始化一个空集,你怎么说它总是返回空集?如果在类实例化后将集合添加到类中,它不会发生对吗?? 初始化为 null 没有帮助。是否按照建议进行了更改,并且仍会删除所选用户的映射表数据 @Thihara 是的。我在想别的东西。对不起。以上是关于当对集合进行 get 调用时,Hibernate 会删除延迟加载的多对多集合的主要内容,如果未能解决你的问题,请参考以下文章
当对 localhost:121/logout 进行 GET 请求时,我得到“accounts.views.logout 没有返回 HttpResponse 对象”。这是一个问题吗?