有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java当关闭相关(相同)的entityManager时,entityManager以前找到或获取的entites是什么?

我正在使用ThreadLocal和请求/实体模式来获取实体。这种情况下,我关闭一个entityManager,后台有一些实体,我可以编辑、复制、修改,然后我想将其保存或与一个新的entityManager合并。我不知道这是一个合法的或完全正确的解决方案

我没有找到关于这个的文章、问题和答案。也许我意识太多了,但我想知道在以这种方式关闭entityManager时是否存在一些已知问题或问题。。。(我想可能是相关实体在置零、关闭后分离)

我以本地方式管理实体资源

还是?如果我感觉良好:entityManager只是通往持久性上下文的桥梁/路径,entityManager是可以替换的,那么托管的Entite和entityManager之间没有真正或严格的联系(从这个意义上说)


共 (1) 个答案

  1. # 1 楼答案

    当您关闭EntityManager时,其所有受管实体都会分离。这没什么错。您仍然可以将分离的实体作为java对象使用,但更改它们的属性不会影响数据库(除非重新连接数据库)。此外,一旦实体被分离,您就不能再遵循在实体仍被连接时尚未初始化的延迟加载关系

    稍后,可以通过调用分离的实体上的merge()方法,将其重新连接到不同的EntityManager。例如:

    // Here myEntity is managed by entityManager1.
    SomeEntity myEntity = entityManager1.find(SomeEntity.class, id);
    
    // myEntity becomes detached.
    entityManager1.close();
    
    // I can still work with the java object.
    myEntity.setSomeProperty("blah");
    
    // Here myEntity becomes managed by entityManager2.
    // It basically retrieves the current entity from the DB (based on its ID),
    // then apply any change that was made to it while it was detached.
    myEntity = entityManager2.merge(myEntity);
    
    // If you commit at this point, the changes made to myEntity while
    // it was detached will be persisted to the DB.
    

    为了防止在分离实体(例如,另一个应用程序修改相应的行)时在数据库中“幕后”进行更改,可以使用@Version字段。每次修改实体时,其版本都会更改。如果试图合并分离的实体,而从数据库检索到的当前版本具有不同的版本,则它将抛出OptimisticLockException