Here both student and address objects have reference to each other, thus, address object can retrieve student data.
- Uni-directional mapping
Lets consider one to one relationship
One student dwells in one Address.
One address can be occupied by only one student
if student domain object has a reference to an address object, but address domain object does not have a reference to the student object, only from a student object you can retrieve address data.
To create a uni-directional mapping using JPA annotation for above relation, we should identify which relation should contain the foreign key. Lets say Student relation contains the foreign key. Therefore, we need a reference to the address and address class will not have any reference
Address class looks like this
package com.sajith.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* Address domain object
*/
@Entity
@Table(name = "ADDRESS")
public class Address {
@Id
@Column(name = "ADDRESS_NO")
private int addressNo;
@Column(name = "STREET")
private String street;
@Column(name = "CITY")
private String city;
public int getAddressNo() {
return addressNo;
}
public void setAddressNo(int addressNo) {
this.addressNo = addressNo;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
In this class addressNo field represents primary key table column ADDRESS_NO. This column is the foreign key column in STUDENT table. To represent this relationship in Student class will contain the address as a field and annotations will be used to indicate that it is the mapping field and hold the foreign key.Student class as follow
package com.sajith.domain;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
/**
* Student Domain class
*
*/
@Entity
@Table(name = "STUDENT")
public class Student {
private int studentId;
private String studentName;
private Address studentAddress;
@Id
@Column(name = "ID")
@GeneratedValue
public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
@Column(name = "NAME")
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "ADDRESS_NO")
public Address getStudentAddress() {
return studentAddress;
}
public void setStudentAddress(Address studentAddress) {
this.studentAddress = studentAddress;
}
}
@OneToOne - States the relationship typeCascadeType.ALL - States that when changes happen to Student, the corresponding Address should be changed as well
E.g: If student is deleted his address should be deleted as well.
@JoinColumn: States the foreign key column
Get the Hibernate configuration file from my previous Hibernate post and adds the Address class
<mapping class="com.sajith.domain.Address"/>
Hibernate Util class
package com.sajith.util;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static ServiceRegistry serviceRegistry;
private static SessionFactory buildSessionFactory() {
Configuration configuration = new Configuration();
configuration.configure();
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
return configuration.buildSessionFactory(serviceRegistry);
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void shutdown() {
// Close caches and connection pools
getSessionFactory().close();
}
}
Main App class
package com.sajith;
import org.hibernate.Session;
import com.sajith.domain.Address;
import com.sajith.domain.Student;
import com.sajith.util.HibernateUtil;
public class App {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Student student1 = new Student();
Address address = new Address();
address.setAddressNo(2);
address.setCity("Colombo");
address.setStreet("Horton Place");
student1.setStudentId(3);
student1.setStudentName("Sanya Fernando");
student1.setStudentAddress(address);
session.save(student1);
session.getTransaction().commit();
System.exit(0);
}
}
As you can see we create a Student instance and assign an address.
Create the tables like following.
Address table
Student table
If you execute the App file, output will be
