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