Ok, in the example i tried to set the list in the ejb, but if removed and
then put the list in the managed bean i get the same behavior
@Named
public class MyBean implements Serializable{
@EJB
private MyEJB ejb;
public void anyMethod(){
User user = ejb.getUserWithRoles();
//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
user.setRoles(roleList);
user.getRoles(); //<---- HERE THE LIST IS ALWAYS NULL
}
}
I dont want these roles get persisted i just want to modify my object, is
still the same even setting the value in the maged bean?
2013/10/18 Romain Manni-Bucau <[email protected]>
> Hi
>
> Your entity is not managed so you cant do it. It is normal.
> Le 18 oct. 2013 19:09, "José Luis Cetina" <[email protected]> a écrit :
>
> > I sent this mail to openJPA mailing list but i dont know if this could be
> > something related to TomEE or just im doing something wrong.
> >
> >
> > I have a "strange" behavior, with list properties of any kind of entity.
> >
> > When i try to set a non empty list to a retrieved entity that has a list
> > value with null (because is not fetched) the entity doesnt "reflect" the
> > new non-empty values that i set.
> >
> > Steps
> > 1. Retrieve any entity (ex. user) from database in an ejb with criterias.
> > 2. The retrieved entity has a OneToMany attribute (roles) by default is
> > lazy thats why if i dont do a fetch (i dont) the list is null
> > 3. Then try to fill the role list with a NON-EMPTY list
> > 4. Here the list that i set has values but the user list has a null in
> the
> > roles list attribute even though i set it in the step 3
> >
> >
> > I dont know why this is happening, the only way i could fix this is
> cloning
> > (using SerializationUtils from Apache commons.lang3) the user entity (see
> > the steps) and with this work, but i dont know why.
> >
> > 1. Retrieve any entity (ex. user) from database in an ejb with criterias.
> > 2. Clone retrieved entity and asig to new one User clonedUser =
> > SerializationUtils.clone(originalRetrivedUser);
> > 3. Then try to fill the role list with a NON-EMPTY list to the clonedUser
> > 4. The list of clonedUser has the correct values
> >
> >
> > Why i need to clone? why i cannot set a list to the entity if is not
> > cloned?
> >
> >
> > Im using Apache TomEE 1.6.0-SNAPSHOT (with the openjpa version embedded)
> >
> >
> > Scenario:
> >
> > ***** 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 CLASS ****
> > @Stateless
> > public class MyEJB{
> >
> > @PersistenceContext(unitName ="ANY_NAME")
> > private EntityManager em;
> >
> > 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 MyEJB 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.
> >
> > }
> >
> >
> > }
> >
> > I know i can get the values fetching but im trying to not do it
> >
>
--
-------------------------------------------------------------------
*SCJA. José Luis Cetina*
-------------------------------------------------------------------