我正在使用 Spring Data 并且我有这样的类结构:
A has-a B and B has-a List<C>
和代码:
List<A> aList= aRepository.findAll();
aList.forEach(a-> a.getB().setC(null));
我不需要前端的 C 列表(在这个特定场景中)。但是,当我将 C 设置为 null 时,EntityManager
不处于分离状态,并且它在数据库中将 C
设置为 null
。检索列表后如何分离列表中的实体?我试过这个:
EntityManager em=entityManagerFactory.createEntityManager();
aList.forEach(a -> em.detach(a) ......);
但是没有成功。有什么建议吗?
编辑:
这是实际的实体(没有不必要的字段):
session
(上例中的 A 类):
@Entity
public class AuthSession {
private AuthUser user;
@ManyToOne
@JoinColumn(name = "user_id",foreignKey = @ForeignKey(name = "fk_auth_user_id"))
public AuthUser getUser() {
return user;
}
public void setUser(AuthUser user) {
this.user = user;
}
}
用户
(上例中的 B 类):
@Entity
public class AuthUser {
private Set<AuthRole> roles;
@ManyToMany
@JoinTable(
name = "USER_ROLE_LINK",
schema = "iapauth",
joinColumns = @JoinColumn(name = "user_id"),
foreignKey = @ForeignKey(name = "fk_user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"),
inverseForeignKey = @ForeignKey(name = "fk_role_fk"))
public Set<AuthRole> getRoles() {
return roles;
}
public void setRoles(Set<AuthRole> roles) {
this.roles = roles;
}
角色
(上例中的 C 类):
@Entity
public class AuthRole{}
我有一个向用户添加角色的代码(自动生成的链接表“USER_ROLE_LINK”中的新条目)。效果很好。我有这个代码来检索所有 session :
EntityManager em=entityManagerFactory.createEntityManager();
List<AuthSession> sessions=sessionRepo.findAll();
sessions.forEach(x->{
em.detach(x);
AuthUser user=x.getUser();
if(user!=null) user.setRoles(null);
});
return sessions;
但是执行此代码后,user-role
表中的条目(用户在当前 session 中的条目)将被删除。
最佳答案
虽然分离的想法是正确的,但您分离了错误的实体。
使用此代码
List<AuthSession> sessions=sessionRepo.findAll();
sessions.forEach(x->{
em.detach(x);
AuthUser user=x.getUser();
if(user!=null) user.setRoles(null);
});
所有AuthUser
由 AuthSession
引用仍由 EntityManager
管理(即不分离)。您需要显式分离它们或将级联配置添加到 AuthSession.user
参见:https://docs.oracle.com/cd/E19798-01/821-1841/bnbqm/index.html
正如 Mukhamedali Zhadigerov 在评论中所描述的那样,我们应该使用注入(inject)的 EntityManager
.
关于java - 在 Spring Data 中分离实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51491486/