2

我有一个带有@ConversationScopedbean 的 Seam 3/JBoss/Hibernate 项目。此 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(),对话中的实体会更新(即更改出现在对话和网页上。但是,即使我结束对话,数据也不会写入数据库。

在站点的另一部分,我能够通过在调用该方法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 回答