0

我正在尝试在休眠中延迟加载实体,但无法克服上述错误。我基本上在玩 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 实体的操作 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);

注意:

  • 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)
4

1 回答 1

0

这个问题是通过将实体管理器绑定到对话范围并使用缝焊来解决的。

@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;

但下一个问题是为什么?

于 2013-05-27T03:41:18.973 回答