I am encountering PersistenceException in designing a web form that results from using Seam-managed persistence context(SMPC) + @OneToOne and <h:selectOneMenu>. I am trying to use the entity as a pure JSF backing bean. The problem is modifying the department's ID, which is still managed by SMPC.
Does anyone know a clever design/solution to use @OneToOne + <h:selectOneMenu> ? The examples in Seam1.1GA do not appear to have this use case covered. The relevant codes are posted below. Thanks.
Caused by: org.jboss.tm.JBossRollbackException: Unable to commit, tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=null:1166713106023/32, BranchQual=null:1166713106023, localId=0:32], status=STATUS_NO_TRANSACTION; - nested throwable: (javax.persistence.PersistenceException: org.hibernate.HibernateException: identifier of an instance of Department was altered from 1 to 2)
Employee.java --
@Name("employee")
@Entity
public class Employee {
@Id
@GeneratedValue
private Long id;
@OneToOne
@JoinColumn(name = "departmentId")
private Department department;
// getters and setters
}
Department.java --
@Name("department")
@Entity
public class Department {
@Id
@GeneratedValue
private Long id;
private String name;
// getters and setters
}
UserView.java --
@Name("userView")
public class UserView {
@In
private EntityManager em;
@Factory("departmentList")
public List<SelectItem> initDepartmentList() {
// use em; to return an instance of List<SelectItem>
}
}
user.xhtml --
<h:selectOneMenu id="user.department" value="#{employee.department.id}">
<f:convertNumber/>
<f:selectItems value="#{departmentList}"/>
</h:selectOneMenu>
<h:commandButton value="Update" action="update"/>