3 Replies Latest reply on Oct 24, 2007 6:23 AM by Pete Muir

    Entity relation deleated

    Matt Higgins Newbie

      This may be an EJB3 question but I am new to both and working with seam ? I have a many to many unidirectional relation. I have a simple from to build these objects / relations up and that works fine. In another form I am trying to work on instances of the object graph but when I display the page the last line in the log is:

      09:09:27,174 INFO [STDOUT] Hibernate: delete from Profile_Location where profile_id=?
      09:09:27,225 INFO [STDOUT] Hibernate: delete from Profile_Location where profile_id=?
      09:09:27,226 INFO [STDOUT] Hibernate: delete from Profile_Location where profile_id=?
      


      I have no delete calls in my code and can't figure out where this is coming from. There are 3 users in the system and that corresponds to the 3 delete calls above. Are my relations mapped wrong? Here is the code for the relations. I have a user and a user has a profile and the profile can have many locations, i.e. a person can have more then one address. The main question is why are these relations being deleted?

      User Entity

      @Entity
      @Name("user")
      public class User implements Serializable {
      
       ...
       private Profile profile;
       ...
       @OneToOne(cascade = CascadeType.ALL)
       @JoinColumn(name = "profile_id")
       public Profile getProfile() {
       return profile;
       }
      
       public void setProfile(Profile profile) {
       this.profile = profile;
       }
      }
      


      Profile Entity

      @Entity
      @Name("profile")
      public class Profile implements Serializable {
       ...
       private Set<Location>locations;
       ....
       @ManyToMany
       @JoinTable(name="Profile_Location",
       joinColumns={@JoinColumn(name="profile_id")},
       inverseJoinColumns={@JoinColumn(name="location_id")})
       public Set<Location> getlocations() {
       return locations;
       }
      
       public void setlocations(Set<Location> locations) {
       locations = locations;
       }
      }
      


      Location Entity. I want the Location to be associated with other types of objects(non just profiles ) there is no reference to the Profile in the Locaiton.

      @Entity
      @Name("location")
      public class Location implements Serializable {
       ...
      }
      


      DistanceCalcAction, this is the statefull session bean that is using the Location entities to calcualte distance between users.

      @Stateful
      @Scope(EVENT)
      @Name("distanceCalc")
      public class DistanceCalcAction implements DistanceCalc {
      
       @Logger Log log;
      
       @PersistenceContext
       private EntityManager em;
      
       private User fromUser;
      
       private User toUser;
      
       @In
       private FacesMessages facesMessages;
      
       @Out
       private List<User> users;
      
       @Out(required=false)
       private Double distance;
      
       @Create
       public void getUsers(){
       users = (List<User>)em.createQuery("SELECT u from User as u").getResultList();
       }
      
       public void calc(){
      
       Distance distanceTool = new Distance();
      
       User from = (User) em.createQuery("SELECT u FROM User u WHERE u.id = :id").setParameter("id",fromUser.getId()).getSingleResult();
       User to = (User) em.createQuery("SELECT u FROM User u WHERE u.id = :id").setParameter("id",toUser.getId()).getSingleResult();
      
       distance = distanceTool.distanceVincenty(
       from.getProfile().getDefaultLocation().getLatitude(),
       from.getProfile().getDefaultLocation().getLongitude(),
       to.getProfile().getDefaultLocation().getLatitude(),
       to.getProfile().getDefaultLocation().getLongitude(), Distance.FORMAT_MILES);
       }
      
       @Factory("fromUser")
       public User getFromUser() {
       fromUser = new User();
       return fromUser;
       }
       @Factory("toUser")
       public User getToUser() {
       toUser = new User();
       return toUser;
       }
      
       public void setFromUser(User fromUser) {
       this.fromUser = fromUser;
       }
      
       public void setToUser(User toUser) {
       this.toUser = toUser;
       }
       @Destroy @Remove
       public void destroy() {}
      
      }