Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 容器管理的实体管理器的持久性上下文的范围_Java_Jpa_Entity_Persistence - Fatal编程技术网

Java 容器管理的实体管理器的持久性上下文的范围

Java 容器管理的实体管理器的持久性上下文的范围,java,jpa,entity,persistence,Java,Jpa,Entity,Persistence,我有两个实体和一个会话bean,如下所示: @Entity public class Manager { @Id private int managerId; private String name; @OneToMany(mappedBy = "manager") private Set<Department> departments; //... constructors, getters and setters } @Ent

我有两个实体和一个会话bean,如下所示:

@Entity
public class Manager {

    @Id
    private int managerId;
    private String name;
    @OneToMany(mappedBy = "manager")
    private Set<Department> departments;

    //... constructors, getters and setters
}

@Entity
public class Department {

    @Id
    private int departmentId;
    @ManyToOne
    private Manager manager;

    //... constructors, getters and setters

}

@Stateless
public class JPADao {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public void addDepartment(Department department) throws Exception { 
        entityManager.persist(department);
    }

    @Override
    public List<Property> getAllDepartments() throws Exception {        
        return entityManager.createNamedQuery("SELECT d FROM Department d").getResultList();
    }

    @Override
    public Set<Department> searchDepartmentByManager(Manager manager) throws Exception {
        manager = entityManager.find(Manager.class, manager.getManagerId());
        manager.getDepartments().size();
        entityManager.refresh(manager); //it won't work if I remove this line

        return manager.getDepartments();
    }
@实体
公共班级经理{
@身份证
私营企业;
私有字符串名称;
@OneToMany(mappedBy=“经理”)
私营部门;
//…构造函数、getter和setter
}
@实体
公共课系{
@身份证
私人int部门ID;
@许多酮
私人经理;
//…构造函数、getter和setter
}
@无国籍
公营班次{
@持久上下文
私人实体管理者实体管理者;
@凌驾
公共无效addDepartment(Department Department)引发异常{
实体经理(部门);
}
@凌驾
公共列表getAllDepartments()引发异常{
返回entityManager.createNamedQuery(“从部门d中选择d”).getResultList();
}
@凌驾
公共集searchDepartmentByManager(Manager)引发异常{
manager=entityManager.find(manager.class,manager.getManagerId());
manager.getDepartments().size();
entityManager.refresh(manager);//如果删除这一行,它将不起作用
returnmanager.getDepartments();
}
出于测试目的,我手动加载了一些数据库中没有部门的经理

调用
addDepartment()
后,将成功添加一个部门并建立关系(部门记录具有与相应经理关联的fk)。在调用
getAllDepartments(
)时也会显示更改。但是,如果调用
addDepartment()
再次调用
searchDepartmentByManager()
,通过传递分离的manager对象,由
entityManager.find()返回的manager对象将不包含刚刚添加的部门。只有在调用
entityManager.refresh(manager)
时,它才会意识到更改

我不明白的是,
entityManager.find()
为什么不返回一个包含最新数据的经理?我在调用
addDepartment()
searchDepartmentByManager()之间在数据库中进行了检查
并且当时成功添加了department对象。不知何故,在调用
entityManager.refresh(manager)
之前,它不会显示在
entityManager.find()中。我感觉这是关于持久性上下文的范围和生存期的,我想了解它的详细信息

如果有人能回答这个问题,我将不胜感激

谢谢你,
Peter.

entityManager.find(…)
如果
Manager
实体实例包含在持久性上下文中,则从那里返回

使用
entityManager.refresh(…)
将使用数据库中的值覆盖
Manager
实体实例

我怀疑正在发生的是,您传递给
searchDepartmentByManager(…)
Manager
实例没有分离。它似乎附加到持久性上下文,并且它已经过时(因为它没有最新的
部门
(s))

您可以尝试以正确的顺序持久化/合并实体,以维护映射的父子责任。这一点已在上文中介绍。(注意,该链接涉及一对一关系,但解决方案应适用于所有类型的双向关系)