Hi,

I have defined a many to many relationship between two classes, viz. 
Event and Person (defined in a separate database table person_event). 
The code of these classes is listed at the end. Now, suppose I want to 
delete a person, so all its related associations with events must also 
get deleted from the person_event table. In other words, I want cascade 
ON DELETE.

Lets consider a scenario.
-  The "events" table contains three events identified by id=1, 2, 3.
- The "person" table contains two persons identified by id=4, 5.
- The "person_event' table containing associations like 1-4, 2-4, 3-5

Now, suppose I delete event 1 using Hibernate.delete(), then not only 
does it delete event1, and association person_event1-4, but also the 
person4 and subsequently, person_event2-4 and event2.

I dont understand why this is happening. Could someone please explain 
where I am committing a mistake.

Thanks in advance

- Abhishek

Event and Person Class

package test;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name="events")
public class Event implements Serializable {
    private Long id;
    private String title;
    private Date date;

    public Event() {
    }

    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    public Long getId() {
        return id;
    }

    private void setId(Long id) {
        this.id = id;
    }

    @Temporal(TemporalType.TIMESTAMP)
    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
   
    private Set<Person> participants = new HashSet<Person>();

    @ManyToMany(
            cascade={CascadeType.ALL},           
            mappedBy="events",
            targetEntity=Person.class
        )
    public Set<Person> getParticipants() {
        return participants;
    }

    public void setParticipants(Set<Person> participants) {
        this.participants = participants;
    }
}

package test;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="person")
public class Person implements Serializable {
   
    private Long person_id;
    private int age;
    private String firstname;
    private String lastname;

    public Person() {}

    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    public Long getId() {
        return person_id;
    }

    public void setId(Long id) {
        this.person_id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    private Set<Event> events = new HashSet<Event>();

    @ManyToMany(
            targetEntity=Event.class,
            cascade={CascadeType.ALL}
            )
    @JoinTable(
            name="person_event",
            [EMAIL PROTECTED](name="person_id")},
            [EMAIL PROTECTED](name="event_id")})
    // Defensive, convenience methods
    protected Set<Event> getEvents() {
        return events;
    }

    protected void setEvents(Set<Event> events) {
        this.events = events;
    }

    public void addToEvent(Event event) {
        this.getEvents().add(event);
        event.getParticipants().add(this);
    }

    public void removeFromEvent(Event event) {
        this.getEvents().remove(event);
        event.getParticipants().remove(this);
    }
}


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
hibernate-devel mailing list
hibernate-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/hibernate-devel

Reply via email to