Reputation: 73
I am a new bie to hibernate. Suppose there are two tables T1 and T2, where the primary key values of T1 is used as primary key for T2 also. For every row in T2 there should be one corresponding row in T1 but the converse need not be true. Is this a one-one mapping ?
Upvotes: 0
Views: 44
Reputation: 94499
This would be known as a one to one mapping using a shared primary key.
Here is an example of how to map the relationship with two entities, state and capital.
Tables
CREATE TABLE `capital` (
`CAPITAL_ID` bigint(20) NOT NULL AUTO_INCREMENT,
`NAME` varchar(45) DEFAULT NULL,
PRIMARY KEY (`CAPITAL_ID`),
CONSTRAINT `STATE_ID` FOREIGN KEY (`CAPITAL_ID`) REFERENCES `state` (`STATE_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE TABLE `state` (
`STATE_ID` bigint(20) NOT NULL AUTO_INCREMENT,
`NAME` varchar(45) DEFAULT NULL,
PRIMARY KEY (`STATE_ID`)
);
State
@Entity
@Table(name = "STATE")
public class State {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "STATE_ID")
private Long stateId;
@Column(name = "NAME")
private String name;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "state")
private Capital capital;
public Long getStateId() {
return stateId;
}
public Capital getCapital() {
return capital;
}
public void setCapital(Capital capital) {
this.capital = capital;
}
public void setStateId(Long stateId) {
this.stateId = stateId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Capital
@Entity
@Table(name = "CAPITAL")
public class Capital {
@Id
@Column(name = "CAPITAL_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long capitalId;
@Column(name = "NAME")
private String name;
@OneToOne
@PrimaryKeyJoinColumn
private State state;
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public Long getCapitalId() {
return capitalId;
}
public void setCapitalId(Long capitalId) {
this.capitalId = capitalId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Example
public class HibernateApplication {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
SessionFactory factory = null;
Session session = null;
org.hibernate.Transaction tx = null;
try {
factory = HibernateUtil.getSessionFactory();
session = factory.openSession();
tx = session.beginTransaction();
State state = new State();
Capital capital = new Capital();
state.setName("Pennsylvania");
capital.setName("Harrisburg");
state.setCapital(capital);
capital.setState(state);
session.save(state);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
session.close();
factory.close();
scanner.close();
}
}
}
Upvotes: 1