gpt4 book ai didi

java - 为什么持久化实体两次可以避免带有连接列的实体级联错误

转载 作者:太空宇宙 更新时间:2023-11-04 10:37:53 25 4
gpt4 key购买 nike

如果我不分两步执行实体角色的设置(仍然存在两步),为什么此单元测试会失败。错误是:

java.lang.IllegalStateException:在同步期间,通过未标记为级联 PERSIST 的关系找到了新对象:io.osram.olt.extension.jpa.Role@16daa399。

    private Role addRoleWithId(String roleId){
Role myRole = new Role();
myRole.setRoleId(roleId);
myRole.setRealmId("my");
myRole.setDescription("role-description-0");
myRole.setExternalCreator(true);
myRole.setName("role-name-0");
em.persist(myRole); //<--- Without this persisting the role fails with the error above.

//Setup joins:
myRole.setAContext(getApplications().get(0));
myRole.setAnotherContext(getTenants().get(0));
em.persist(myRole);
return myRole;
}

...

角色实体:

        @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ANOTHER_CONTEXT_ID")
private AnotherContext anotherContext;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ACONTEXT_ID")
private AContext aContext;

...
public Role setAContext(AContext aContext) {
this.aContext = aContext;
if(aContext != null) {
aContext.addRole(this);
}
return this;
}

public Role setAnotherContext(AnotherContext anotherContext) {
this.anotherContext = anotherContext;
if(anotherContext != null){
anotherContext.addRole(this);
}
return this;
}

...

AContext 和 AnotherContext 都包含与角色相似的关系:

@OneToMany
@JoinTable(
name="OLT_ROLES_ACONTEXT",
joinColumns = @JoinColumn( name="ACONTEXT_ID"),
inverseJoinColumns = @JoinColumn( name="ROLE_ID")
)
private Set<Role> roles = new HashSet<Role>();

看来通过分两步创建对象我可以避免使用级联。

最佳答案

在您的 setAContextsetAnotherContext 方法中,您尝试设置尚未持久化的 Role 对象。因此,很明显,在设置上下文之前,如果没有 em.persist(myRole);,它就无法工作,因为您尚未指定 CaseCadeType.PERSIST

关于java - 为什么持久化实体两次可以避免带有连接列的实体级联错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49293424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com