2

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 を使用することを勧めていますが、何ができるかわかりません。

コメントをいただければ幸いです。

4

1 に答える 1