Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 分离Spring数据中的实体_Java_Spring_Spring Data Jpa_Spring Data - Fatal编程技术网

Java 分离Spring数据中的实体

Java 分离Spring数据中的实体,java,spring,spring-data-jpa,spring-data,Java,Spring,Spring Data Jpa,Spring Data,我使用的是Spring数据,我有这样的类结构: A has-a B and B has-a List<C> 但它不起作用。有什么建议吗 编辑: 以下是实际实体(没有不必要的字段): 会话(上例中为A类): 用户(上例中为B类): 我有一个向用户添加角色的代码(自动生成的链接表“user\u ROLE\u link”中的新条目)。它很好用。我有以下代码来检索所有会话: EntityManager em=entityManagerFactory.createEntityManage

我使用的是Spring数据,我有这样的类结构:

A has-a B  and  B has-a List<C>
但它不起作用。有什么建议吗

编辑:

以下是实际实体(没有不必要的字段):

会话
(上例中为A类):

用户
(上例中为B类):

我有一个向用户添加角色的代码(自动生成的链接表“user\u ROLE\u link”中的新条目)。它很好用。我有以下代码来检索所有会话:

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;
EntityManager em=EntityManager工厂。createEntityManager();
List sessions=sessionRepo.findAll();
sessions.forEach(x->{
em.x;
AuthUser=x.getUser();
if(user!=null)user.setRoles(null);
});
返回会议;

但执行此代码后,
用户角色
表中的条目(用户在当前会话中的条目)将被删除。

虽然分离的想法是正确的,但分离的实体是错误的

使用此代码

List<AuthSession> sessions=sessionRepo.findAll();
sessions.forEach(x->{
    em.detach(x);
    AuthUser user=x.getUser();
    if(user!=null) user.setRoles(null);
});
列表


正如Mukhamedali Zhadigerov在评论中所描述的那样,应该使用注入式的
实体管理器

虽然分离的想法是正确的,但分离的实体是错误的

使用此代码

List<AuthSession> sessions=sessionRepo.findAll();
sessions.forEach(x->{
    em.detach(x);
    AuthUser user=x.getUser();
    if(user!=null) user.setRoles(null);
});
列表



正如Mukhamedali Zhadigerov在评论中所描述的,应该使用注入式
EntityManager

这是一种方法。您能提供一些示例代码和实际的实例吗?您正在分离哪些实体?它们是否被
EntityManager
管理的其他实体引用?您的级联配置是什么样子的?我认为您需要遍历C列表并将其单独分离。@Jens Schauder请参见上面的编辑使用带数据的查询连接这是一种方法。您能提供一些示例代码和实际的实例吗?您正在分离哪些实体?它们是否被
EntityManager
管理的其他实体引用?您的级联配置是什么样子的?我认为您需要迭代C列表并单独分离它。@Jens Schauder看到上面的编辑使用带有DTOBy的查询连接“显式分离它们”您的意思是在forEach循环中
em.detach(user)
?不,它不起作用。我想我需要以某种方式分离用户角色实体(它不存在,因为它是自动创建的)。顺便说一下,我添加了
e.contains(ses.getUser())
,它返回false。我想我没有正确地获取EntityManager,因为即使
e.contains(ses)
也返回false。好的,结果证明我用不正当的方式得到了整个经理。我添加了
@PersistenceContext-private-EntityManager-EntityManager成功了。感谢“显式分离它们”您是指forEach循环中的
em.detach(user)
?不,它不起作用。我想我需要以某种方式分离用户角色实体(它不存在,因为它是自动创建的)。顺便说一下,我添加了
e.contains(ses.getUser())
,它返回false。我想我没有正确地获取EntityManager,因为即使
e.contains(ses)
也返回false。好的,结果证明我用不正当的方式得到了整个经理。我添加了
@PersistenceContext-private-EntityManager-EntityManager成功了。谢谢
@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;
    }
@Entity
public class AuthRole{}
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;
List<AuthSession> sessions=sessionRepo.findAll();
sessions.forEach(x->{
    em.detach(x);
    AuthUser user=x.getUser();
    if(user!=null) user.setRoles(null);
});