Monday, June 15, 2009

Hibernate OneToMany annotation mapping using JoinTable

Hibernate OneToMany annotation mapping using JoinTable

Recently I explored Hibernate OneToMany annotation mapping using JoinTable.

Consider an Airline entity having list of Airports. The mapping between the two is stored in a JoinTable airline_airports.

CREATE TABLE airline(
code char(2) PRIMARY KEY NOT NULL,
name varchar(50) NOT NULL
);

CREATE TABLE airport(
code char(3) PRIMARY KEY NOT NULL,
name varchar(50) NOT NULL
);

CREATE TABLE airline_airport(
airline_code char(2) NOT NULL,
airport_code char(3) NOT NULL,
CONSTRAINT PRIMARY PRIMARY KEY (airline_code,airport_code)
);

ALTER TABLE airline_airport ADD CONSTRAINT airline_airport_ibfk_1
FOREIGN KEY (airline_code) REFERENCES airline(code) ON DELETE NO ACTION ON UPDATE NO ACTION;

ALTER TABLE airline_airport ADD CONSTRAINT airline_airport_ibfk_2
FOREIGN KEY (airport_code) REFERENCES airport(code) ON DELETE NO ACTION ON UPDATE NO ACTION;

First of all we need to create Hibernate Entities for Airline and Airport using annotations. Notice the annotations defined for airports attribute of Airline class. This is where we are defining the relationship between Airline and Airport.

@Entity
@Table(name = "airline")
public class Airline implements Serializable {
@Id
@Column(name = "code")
private String code;
@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@JoinTable(name = "airline_airport", joinColumns = @JoinColumn(name = "airline_code")
, inverseJoinColumns = @JoinColumn(name = "airport_code")
)
private List airports;

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

public List getAirports() {
return airports;
}

public void setAirports(List airports) {
this.airports = airports;
}
}

@Entity
@Table(name = "airport")
public class Airport implements Serializable {
@Id
@Column(name = "code")
private String code;
@Column(name = "name")
private String name;

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

Create an Airline object and add a list of Airlines. When you will save the airline object, hibernate will persist all the data in airline, airport and airline_airport table.

If you don't use the cascade annotation then ii will not save the data in airport table. This means it will fail to insert record in airline_airport table if an airport is not already in the airport table.

No comments:

Post a Comment