分离的实体不可变列表属性

时间:2013-10-21 22:10:32

标签: java-ee jsf-2 ejb jpa-2.0 openjpa

在OpenJPA 2.2中,当我分离某个实体时,所有列表属性都是“readonly(immutables)我无法更改它们,但我可以更改其他属性,如String”。

这是任何实体中列表属性的正常行为吗?或者只是openjpa的限制,那么规范所说的正常行为是什么?

实体

@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 getUser(){

        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 user = em.createQuery(cq).getSingleResult());
       em.detach(user); //detaching user object
       return user;
  }

}

MANAGED BEAN

@Named
public class MyBean implements Serializable{

 @EJB
 private MyEJBLocal ejb;

 public void anyMethod(){
   User user = ejb.getUser();
   //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);

    user.getRoles(); //<---- HERE THE LIST IS ALWAYS NULL

    user.setUserName("new_name");//<--- But this works

 }
}

我要做的是克隆我的实体以添加或更改列表值。有人建议我使用DTO,但我不知道我能做些什么。

我将不胜感激。

1 个答案:

答案 0 :(得分:0)

无论是否分离,你都必须保持双方的关系。

Java Persistence 2.0,最终版本:

  

开发人员有责任保留内存中的引用   在拥有方持有而在反方保持一致   当他们改变时彼此相依。

在持久化期间,拥有方是存储到db的内容。

  

关系可以是双向的或单向的。双向的   关系既有拥有方又有反(非拥有)方。   单向关系只有一个拥有方。拥有方   关系中的关系决定了对关系的更新   数据库,如节中所述   3.2.4。

     

...

     

一对多/多对一双向关系的多方面   必须是拥有方,因此mappedBy元素不能   在ManyToOne注释上指定。

在您的情况下,角色实体是拥有方。

顺便说一下。用户和角色通常有多对多的关系。