对实体的更改没有刷新到Seam 3 / Hibernate中的DB

时间:2012-09-15 16:54:02

标签: java hibernate jboss7.x seam3

我有一个带有@ConversationScoped bean的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()重定向到其他页面来更新数据库中的实体。但是我想在保存此实体时将用户保持在同一页面上。

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

如果您不使用任何交易,CUD操作只会在业务层对象中完成。你必须在进行任何CUD操作之前开始一个事务,并在完成poeration之后提交(或刷新???)。

试试这个:

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

有关详细信息:http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/transactions.html