2 Replies Latest reply on Jan 3, 2007 4:01 PM by hstang

    best practice question: SMPC, @OneToOne and <h:selectOneMenu

      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"/>