检索到的实体无法替换为新列表

时间:2013-10-20 06:28:08

标签: jsf-2 jpa-2.0 ejb-3.1 openjpa tomee

我对任何类型的实体的列表属性都有“奇怪”的行为。

当我尝试将非空列表设置为具有null值的列表值的检索实体时(因为未提取),实体不会“反映”我设置的新非空值。

步骤

  1. 使用条件从ejb中的数据库中检索任何实体(例如用户)。
  2. 检索到的实体默认具有OneToMany属性(角色)是懒惰的,这就是为什么如果我不进行提取(我没有)列表为空
  3. 然后尝试使用NON-EMPTY列表填写角色列表
  4. 这里我设置的列表有值但是用户列表在角色列表属性中为空,即使我在步骤3中设置了它
  5. 我不知道为什么会这样,我解决这个问题的唯一方法就是克隆(使用来自Apache commons.lang3的SerializationUtils)用户实体(参见步骤)和这项工作,但我不知道这是为什么。

    1. 使用条件从ejb中的数据库中检索任何实体(例如用户)。
    2. 克隆检索到的实体并分配给新的用户clonedUser = SerializationUtils.clone(originalRetrivedUser);
    3. 然后尝试使用NON-EMPTY列表填充角色列表到clonedUser
    4. clonedUser列表具有正确的值
    5. 为什么我需要克隆?如果没有克隆,为什么我不能为实体设置列表?

      我正在使用Apache TomEE 1.6.0-SNAPSHOT(嵌入了openjpa版本)

       ***** ENTITIES *****
          @Entity
          public class User implements Serializable{
      
             @Id
             private int id;
             private String userName;
             private String password;
             @OneToMany(mappedBy = "user")
             private List<Role> roles;
      
             //getters and setters..
      
          }
      
      
          @Entity 
          public class Role implements Serializable{
      
             @Id
             private int id;
             private String roleName;
             @ManyToOne
             @JoinColumn(name = "user_id")
             private User user;
      
            //getters and setters..
          }
      
      
         **** EJB INTERFACE LOCAL ****
         @Local
         public interface MyEJBLocal{
            public User getUserWithRoles();
         }
      
      
          **** EJB CLASS ****
          @Stateless
          public class MyEJB implements MyEJBLocal{
      
              @PersistenceContext(unitName ="ANY_NAME")
              private EntityManager em;
      
            @Override
            public User getUserWithRoles(){
      
                  CriteriaBuilder cb = em.getCriteriaBuilder();
                  CriteriaQuery<User> cq = cb.createQuery(User.class);
                  Root<User> root = cq.from(User.class);
      
                  cq.where(cb.equal(root.get(User_.userName),"john"));
      
                 User userJohn = em.createQuery(cq).getSingleResult();  // if I want this work I have to do User userJohn = SerializationUtils.clone(em.createQuery(cq).getSingleResult());  [1*]
      
      
                 //I will create a list of role just for try to set any role the userJohn
                List<Role> roleList = new ArrayList<Role>(2);
                roleList.add(new Role(1,'ADMIN'); //creating and adding role 1
                roleList.add(new Role(2,'DEVELOPER');//creating and adding role 2
      
               //setting the list of roles created to the user, as you can see the list has 2 values but the value roles of userJohn always is set to null, my setters and getters are correct
               userJohn.setRoles(roleList);
      
               return userJohn;
            }
      
          }
      
          *** MANAGED BEAN ****
      
          @Named
          public class MyBean implements Serializable{
      
           @EJB
           private MyEJBLocal ejb;
      
           public void anyMethod(){
             User user = ejb.getUserWithRoles();
              user.getRoles(); //<---- HERE THE LIST IS ALWAYS NULL but if I use clone in the ejb method (see 1*) I can get the corrected values.
      
           }
          }
      

      我知道我可以通过提取来获取值,但我不想这样做。

      在前面的例子中,我尝试在ejb中设置列表,但如果我删除然后将列表放在托管bean中,我会得到相同的行为

      我只想要检索实体并添加一些信息,但我不想保留这些新信息。

      我正在尝试使用分离方法,但没有任何变化。

      我不想使用@Transient,因为有时我需要保留数据,这个想法很简单,我想要检索一个实体然后在managedbean中我想添加一个新列表但不管我设置的是什么实体(用户)的列表(角色)实体上的列表总是设置为null,就像实体中的列表以某种方式受到保护一样。

0 个答案:

没有答案