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 = マージ
  • MEMBER ロールはすでにロール テーブルに存在します
  • また、ロールを取得しようとしました: 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

この問題は、エンティティ マネージャを会話スコープにバインドし、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;

しかし、次の質問はなぜですか?

于 2013-05-27T03:41:18.973 に答える