In this tutorial we will explore how to map two entities.
Say we have two entity Employee and Address, every employee will have one associated address, association will look like:

JPA supports multiple types of mapping, in this tutorial we will see how to do “Uni-Directional” One to One Mapping.
First we will setup our pom.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mumz.test.jpa</groupId> <artifactId>TestJPAProject</artifactId> <version>0.0.1-SNAPSHOT</version> <name>TestJPAProject</name> <description>TestJPAProject</description> <dependencies> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> <version>1.0.0.Final</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build> </project>
Second we will write our simple Employee entity.
Employee.java
/**
*
*/
package com.mumz.jpa.mapping.onetoone;
import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
/**
* The Class Employee.
*
* @author prabhat.jha
*/
@Entity
@Table(name = "")
public class Employee implements Serializable {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 578658067302993111L;
/** The id. */
private Long id = null;
/** The name. */
private String name = null;
/** The is active. */
private String isActive = null;
/** The address. */
private EmployeeAddress address = null;
/**
* Gets the id.
*
* @return the id
*/
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "EMPLOYEE_ID")
public Long getId() {
return id;
}
/**
* Sets the id.
*
* @param id
* the id to set
*/
public void setId(Long id) {
this.id = id;
}
/**
* Gets the name.
*
* @return the name
*/
@Column(name="EMPLOYEE_NAME")
public String getName() {
return name;
}
/**
* Sets the name.
*
* @param name
* the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* Gets the checks if is active.
*
* @return the isActive
*/
@Column(name="IS_ACTIVE")
public String getIsActive() {
return isActive;
}
/**
* Sets the checks if is active.
*
* @param isActive
* the isActive to set
*/
public void setIsActive(String isActive) {
this.isActive = isActive;
}
/**
* Gets the address.
*
* @return the address
*/
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="EMPLOYEE_ADDRESS_ID")
public EmployeeAddress getAddress() {
return address;
}
/**
* Sets the address.
*
* @param address
* the address to set
*/
public void setAddress(EmployeeAddress address) {
this.address = address;
}
/**
* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((address == null) ? 0 : address.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((isActive == null) ? 0 : isActive.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
/**
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof Employee)) {
return false;
}
Employee other = (Employee) obj;
if (address == null) {
if (other.address != null) {
return false;
}
} else if (!address.equals(other.address)) {
return false;
}
if (id == null) {
if (other.id != null) {
return false;
}
} else if (!id.equals(other.id)) {
return false;
}
if (isActive == null) {
if (other.isActive != null) {
return false;
}
} else if (!isActive.equals(other.isActive)) {
return false;
}
if (name == null) {
if (other.name != null) {
return false;
}
} else if (!name.equals(other.name)) {
return false;
}
return true;
}
/** (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return String.format("Employee [id=%s, name=%s, isActive=%s, address=%s]", id, name, isActive, address);
}
}
Third we will write the second entity EmployeeAddress.
EmployeeAddress.java
package com.mumz.jpa.mapping.onetoone;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* The Class EmployeeAddress.
*
* @author prabhat.jha
*/
@Entity
@Table(name = "EMPLOYEE_ADDRESS")
public class EmployeeAddress implements Serializable {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = -3901477366664399455L;
/** The id. */
private Long id = null;
/** The state. */
private String state = null;
/** The city. */
private String city = null;
/**
* Gets the id.
*
* @return the id
*/
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "EMPLOYEE_ADDRESS_ID")
public Long getId() {
return id;
}
/**
* Sets the id.
*
* @param id
* the id to set
*/
public void setId(Long id) {
this.id = id;
}
/**
* Gets the state.
*
* @return the state
*/
@Column(name="EMPLOYEE_ADDRESS_STATE")
public String getState() {
return state;
}
/**
* Sets the state.
*
* @param state
* the state to set
*/
public void setState(String state) {
this.state = state;
}
/**
* Gets the city.
*
* @return the city
*/
@Column(name = "EMPLOYEE_ADDRESS_CITY")
public String getCity() {
return city;
}
/**
* Sets the city.
*
* @param city
* the city to set
*/
public void setCity(String city) {
this.city = city;
}
/**
* (non-Javadoc).
*
* @return the int
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((city == null) ? 0 : city.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((getState() == null) ? 0 : getState().hashCode());
return result;
}
/**
* (non-Javadoc).
*
* @param obj
* the obj
* @return true, if successful
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof EmployeeAddress)) {
return false;
}
EmployeeAddress other = (EmployeeAddress) obj;
if (city == null) {
if (other.city != null) {
return false;
}
} else if (!city.equals(other.city)) {
return false;
}
if (id == null) {
if (other.id != null) {
return false;
}
} else if (!id.equals(other.id)) {
return false;
}
if (getState() == null) {
if (other.getState() != null) {
return false;
}
} else if (!getState().equals(other.getState())) {
return false;
}
return true;
}
/**
* (non-Javadoc).
*
* @return the string
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return String.format("EmployeeAddress [id=%s, state=%s, city=%s]", id, getState(), city);
}
}
Third we need persistence.xml, create persistence.xml inside your META-INF folder under src/main/resources.
persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="jpaPersistenceUnit" transaction-type="RESOURCE_LOCAL"> <class>com.mumz.jpa.mapping.onetoone.Employee</class> <class>com.mumz.jpa.mapping.onetoone.EmployeeAddress</class> <properties> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa_schema" /> <property name="javax.persistence.jdbc.user" value="root" /> <property name="javax.persistence.jdbc.password" value="root" /> </properties> </persistence-unit> </persistence>
Fourth we need the schema of the database, in this tutorial we are using MySQL.
jpa_schema
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
DROP SCHEMA IF EXISTS `jpa_schema` ;
CREATE SCHEMA IF NOT EXISTS `jpa_schema` DEFAULT CHARACTER SET utf8 ;
USE `jpa_schema` ;
-- -----------------------------------------------------
-- Table `jpa_schema`.`employee_address`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `jpa_schema`.`employee_address` ;
CREATE TABLE IF NOT EXISTS `jpa_schema`.`employee_address` (
`EMPLOYEE_ADDRESS_ID` INT(11) NOT NULL AUTO_INCREMENT ,
`EMPLOYEE_ADDRESS_CITY` VARCHAR(45) NOT NULL ,
`EMPLOYEE_ADDRESS_STATE` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`EMPLOYEE_ADDRESS_ID`) )
ENGINE = InnoDB
AUTO_INCREMENT = 7
DEFAULT CHARACTER SET = utf8;
-- -----------------------------------------------------
-- Table `jpa_schema`.`employee`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `jpa_schema`.`employee` ;
CREATE TABLE IF NOT EXISTS `jpa_schema`.`employee` (
`EMPLOYEE_ID` INT(11) NOT NULL AUTO_INCREMENT ,
`EMPLOYEE_NAME` VARCHAR(45) NOT NULL ,
`EMPLOYEE_ADDRESS_ID` INT(11) NOT NULL ,
`IS_ACTIVE` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`EMPLOYEE_ID`) ,
INDEX `FK_EMPLOYEE_ADDRESS_ID` (`EMPLOYEE_ADDRESS_ID` ASC) ,
CONSTRAINT `FK_EMPLOYEE_ADDRESS_ID`
FOREIGN KEY (`EMPLOYEE_ADDRESS_ID` )
REFERENCES `jpa_schema`.`employee_address` (`EMPLOYEE_ADDRESS_ID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
AUTO_INCREMENT = 7
DEFAULT CHARACTER SET = utf8;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Final step is write some test code to check if our code is working, Let’s write a simple Java program which will do this for us.
OneToOneUniDirectionalMainApp.java
package com.mumz.jpa.mapping.onetoone;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class OneToOneUniDirectionalMainApp {
public static void main(String[] args) {
EntityManager entityManager = Persistence.createEntityManagerFactory("jpaPersistenceUnit").createEntityManager();
Employee employee = new Employee();
employee.setIsActive("True");
employee.setName("Test");
EmployeeAddress employeeAddress = new EmployeeAddress();
employeeAddress.setCity("XYZ");
employeeAddress.setState("ABC");
employee.setAddress(employeeAddress);
EntityTransaction transaction = entityManager.getTransaction();
try {
transaction.begin();
entityManager.persist(employee);
transaction.commit();
employee = entityManager.find(Employee.class, new Long(2));
System.out.println(employee);
} catch (Exception e) {
e.printStackTrace();
transaction.rollback();
} finally {
entityManager.close();
}
}
}
Yeah we are all done!
Cool dude 🙂
Way to go