Java 分离Spring数据中的实体
我使用的是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
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);
});