当前位置: 首页 > 知识库问答 >
问题:

保存懒惰的孩子是导致:瞬态对象异常:对象引用未保存的瞬态实例-在刷新之前保存瞬态实例

闾丘卓
2023-03-14

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

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 { }

然后我有一个创建User实体的action bean,我们称之为方法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);

请注意:

  • 用户服务。创建=持续

以下是完整的错误日志:

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)

共有1个答案

司马建柏
2023-03-14

这个问题是通过将实体管理器绑定到对话范围并使用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;

但下一个问题是为什么?

 类似资料: