这是我的简单代码:
public static void main(String[] args) {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("main");
EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Team team1 = entityManager.find(Team.class, 0);
System.out.println(entityManager.contains(team1));
Team team2 = new Team();
System.out.println(entityManager.contains(team2));
entityManager.detach(team1);
System.out.println(entityManager.contains(team1));
entityManager.merge(team1);
System.out.println(entityManager.contains(team1));
transaction.commit();
entityManager.close();
}
产出如下:
true
false
false
false
查看最后一个false
,应该是正确的,因为我将该实体合并到实体管理器。知道为什么这是假的吗?
发布于 2021-04-04 02:00:36
实体管理器将返回新实例:
team1 = entityManager.merge(team1)
3.2.4.1合并分离实体状态
合并操作允许将状态从分离的实体传播到由EntityManager管理的持久性实体。
应用于实体X的合并操作的语义如下:
如果X是独立实体,则将X的状态复制到相同标识的已存在的托管实体实例X‘或创建X的新托管副本X’。如果X是新的实体实例,则创建新的托管实体实例X‘,并将X的状态复制到新的托管实体实例X’。如果X是删除的实体实例,则合并操作将引发IllegalArgumentException
(否则事务提交将失败)。如果X是托管实体,则将被合并操作忽略,但是,合并操作级联到X的关系引用的实体,如果这些关系已用级联元素值cascade=MERGE
或cascade=ALL
cascade=ALL
注释所有实体Y由具有级联元素值cascade=MERGE
或cascade=ALL
的X引用的关系引用,则Y作为Y‘递归合并。对于X引用的所有这些Y,X‘被设置为引用Y’。(请注意,如果X是托管的,则X是与X‘相同的对象。)如果X是一个合并为X’的实体,并引用另一个实体Y,其中没有指定或cascade=ALL
,那么从X‘导航同一个关联将产生对托管对象Y’的引用,其持久化标识与Y.相同。
https://stackoverflow.com/questions/66939760
复制