【问题标题】:Detached entities immutable list attributes分离实体不可变列表属性
【发布时间】:2013-10-30 14:31:33
【问题描述】:

在 OpenJPA 2.2 中,当我分离某个实体时,所有列表属性都是“只读(不可变)我无法更改它们,但我可以更改一些其他属性,例如字符串”。

这是任何实体中列表属性的正常行为吗?或者仅仅是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 接口

@Local
public interface MyEJBLocal{
   public User getUserWithRoles();
}

EJB 类

@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;
  }

}

管理豆

@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,但我不确定我能做什么。

我将不胜感激。

【问题讨论】:

  • 您在 userJohn 上调用 setter,但在 user 上调用 getter。只是一个错字?同样,接口定义了getUserWithRoles(),而bean实现了getUser()。
  • @Mareen 只是一个错字

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


【解决方案1】:

无论分离,你都要维护双方的关系。

Java Persistence 2.0,最终版本:

开发者有责任保留内存中的引用 持有方持有和持有方持有一致 当他们改变时彼此相伴。

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

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

...

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

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

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

【讨论】:

  • 是的,但我不想坚持,我只想在我的 mangedbean 中添加一个新列表以进行合并操作。列表永远不会改变是不可变的!!。我知道双向 FK 这只是一个例子,顺便说一下,角色和用户只是一个想法。
  • 当我分离和反对列表必须是不可变的?我在规范中找不到说该列表必须是不可变的东西!
  • @maxtorzito:不,列表不应该是不可变的。如果你真的用非空值​​调用setter,然后立即调用getter,你应该得到非空值。我怀疑 OpenJPA 2.2 中是否存在这样的错误,但我无法验证这一点。您应该考虑发布更多代码。
  • @maxtorzito:另一方面 - 当你以你的方式调用 detach 时,只有用户被分离,由于延迟加载,它的角色还没有被提取,因此它们不能被分离。一旦它们被获取,它们将处于附加状态。
猜你喜欢
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 2015-08-10
  • 2012-04-22
  • 1970-01-01
相关资源
最近更新 更多