2

Beanを使用したSeam3/ JBoss/Hibernateプロジェクトがあり@ConversationScopedます。このBeanは、の作成/編集を管理し@Entityます。エンティティに加えられた変更を保存し、ユーザーを現在のページに維持できるようにしたいと思います。

@Named
@Stateful
@ConversationScoped
public class TeamManagementBean implements Serializable {

    @PersistenceContext(type = PersistenceContextType.EXTENDED)
    private EntityManager entityManager;

    @Inject
    Conversation conversation;

    @Inject
    FlushModeManager flushModeManager;

    protected Team team;

    @Inject
    @CurrentUser
    private User currentAccount;

    @Begin
    public void loadTeam(Team team) {
        if(conversation.isTransient()) conversation.begin();
        flushModeManager.setFlushModeType(FlushModeType.MANUAL);
        this.team = team;
    }


    public void save() {
        if(team.isUnsaved()) entityManager.persist(team);
        entityManager.flush();
    }

save()呼び出されると、会話内のエンティティが更新されます(つまり、変更は会話とWebページに表示されます。ただし、会話を終了しても、データはデータベースに書き込まれません。

サイトの別の部分では、メソッドが呼び出されfaces-config.xmlたときに別のページにリダイレクトすることで、データベース内のエンティティを更新することができました。save()ただし、このエンティティを保存するときに、ユーザーを同じページに保持したいと思います。

4

2 に答える 2

1

loadTeam()エンティティが;に渡されるときにどのようにロードされるかによって異なります。これはentityManager.find()、クエリを使用するか、クエリを使用して実行する必要があります。Hibernateは、エンティティが現在の永続コンテキストに属している場合にのみデータベースを更新します。これは、次entityManager.contains()の例を使用して確認できます。

 public void save() {
    ...
    System.out.println("contains(): " + entityManager.contains(team));
    entityManager.flush();
}

可能であれば、System.out.println()もちろん、への呼び出しは、ロギング機能を使用して置き換える必要があります。

エンティティがに渡される前に切り離されている場合はloadTeam()、を使用する必要がありますentityManager.merge()

于 2012-09-21T14:23:45.943 に答える
0

トランザクションを使用しない場合、CUD操作はビジネスレイヤーオブジェクトで実行されます。CUD操作を実行する前にトランザクションを開始し、ポアレーションが完了した後にそれをコミット(またはフラッシュ???)する必要があります。

これを試して:

entityManager.getTransaction().begin();
entityManager.persist(team);
entityManager.getTransaction().commit();

詳細については、http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/transactions.htmlをご覧ください。

于 2012-09-16T04:19:02.083 に答える