繁体   English   中英

保存惰性子项导致:TransientObjectException:对象引用了一个未保存的瞬态实例-在刷新之前保存该瞬态实例

[英]Saving lazy child is causing: TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing

我正在休眠中尝试延迟加载实体,但无法克服上面的错误。 我基本上是在玩两个实体:用户和角色:

public class User implements Serializeable {
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "T_USER_ROLE", joinColumns = @JoinColumn(name = "USER_ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID"))
    private Set<Role> roles = new HashSet<Role>();
}

public class Role implements Serializeable { }

然后,我有一个操作bean创建了User实体,我们称这种方法为1:

user.getRoles().add(roleService.findByName(RolesEnum.ADMIN.toString()));
em.persist(user);

然后我尝试在设置角色和更新之前先保留用户实体,但是它也失败了:

userService.create(user);
User user = userService.findById(user.getId());
Set<Role> roles = new HashSet<Role>();
roles.add(roleService.findByName(RolesEnum.MEMBER.toString()));
user.setRoles(roles);
userService.update(user, true);

注意:

  • userService.create =坚持
  • userService.update =合并
  • 角色表中已存在成员角色
  • 我还尝试获取角色:entity.getRoles();

以下是完整的错误日志:

java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.test.Role org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1374)

通过将实体管理器绑定到对话范围并使用seam-solder可以解决此问题。

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE })
public @interface TempJpa { }

@ExtensionManaged
@ConversationScoped
@Produces
@PersistenceUnit(unitName="tempDataSource")
@TempJpa
private EntityManagerFactory emf;

@Inject
@TempJpa
protected EntityManager em;

但是下一个问题是为什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM