java - 在 Spring Data 中分离实体

标签 java spring spring-data-jpa spring-data

我正在使用 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);
});

所有AuthUserAuthSession 引用仍由 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/

相关文章:

java - 如何使用 Spring MVC Jackson 拦截 HttpServletRequest

Java - 如何仅接受日期输入的整数?

java - 在 Java 中将 java.lang.object 转换为 int

java - Encog 神经网络总是给出不一致的结果

java - 无法打开 beans.xml(配置文件)因为不存在

java - 什么时候我们需要多个Dispatcher Servlet?

java - TableView setCellFactory 根据值的类型

java - 如何检索给定域类的 Spring 数据存储库实例?

kotlin - Kotlin 的 DAO 应该返回 Optional 还是 null?

java - JPARepository findByUserName 方法返回 null 值