我对任何类型的实体的列表属性都有“奇怪”的行为。
当我尝试将非空列表设置为具有null值的列表值的检索实体时(因为未提取),实体不会“反映”我设置的新非空值。
步骤
我不知道为什么会这样,我解决这个问题的唯一方法就是克隆(使用来自Apache commons.lang3的SerializationUtils)用户实体(参见步骤)和这项工作,但我不知道这是为什么。
为什么我需要克隆?如果没有克隆,为什么我不能为实体设置列表?
我正在使用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,就像实体中的列表以某种方式受到保护一样。