Hibernate One-to-One mapping with Annotations with mappedBy:
This Hibernate tutorial demonstrates how to use JPA annotations in order to implement a bidirectional one-to-one association on a foreign key.
This Hibernate tutorial demonstrates how to use JPA annotations in order to implement a bidirectional one-to-one association on a foreign key.
mappedBy: The attribute mappedBy indicates that the entity in this
side is the inverse of the relationship, and the owner resides in the
"other" entity. This also means that you can access the other table
from the class which you've annotated with "mappedBy" (fully
bidirectional relationship).
The annotation mappedBy ideally should always be used in the Parent side (Book class) of the bi directional relationship, in this case it should be in Book class pointing to the member variable 'book' of the Child class (Author class)
Example:
Book.java
package
com.hibernate.practice.onetoone;
import java.util.Date;
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;
import
javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name="BOOK")
public class Book {
private Long bookId;
private String bookTitle;
private String bookDescription;
private Date publishedDate;
private Author author;
public Book(){
}
@Id
@Column(name="BOOK_ID")
@GeneratedValue
public Long getBookId()
{
return bookId;
}
public void setBookId(Long
bookId) {
this.bookId = bookId;
}
@Column(name="TITLE")
public String
getBookTitle() {
return bookTitle;
}
public void setBookTitle(String
bookTitle) {
this.bookTitle = bookTitle;
}
@Column(name="DESCRIPTION")
public String
getBookDescription() {
return bookDescription;
}
public void
setBookDescription(String bookDescription) {
this.bookDescription =
bookDescription;
}
@Temporal(TemporalType.DATE)
@Column(name="PUBLISHED")
public Date
getPublishedDate() {
return publishedDate;
}
public void
setPublishedDate(Date publishedDate) {
this.publishedDate = publishedDate;
}
@OneToOne(cascade =
CascadeType.ALL)
@JoinColumn(name="AUTHOR_ID")
public Author
getAuthor() {
return author;
}
public void setAuthor(Author
author) {
this.author = author;
}
}
Author.java
package
com.hibernate.practice.onetoone;
import
javax.persistence.Column;
import
javax.persistence.Entity;
import
javax.persistence.GeneratedValue;
import
javax.persistence.Id;
import
javax.persistence.OneToOne;
import
javax.persistence.Table;
@Entity
@Table(name="AUTHOR")
public class Author {
private Long authorId;
private String name;
private String email;
private Book book;
public Author(){
}
public Author(String
name, String email) {
this.name = name;
this.email = email;
}
@Id
@Column(name="AUTHOR_ID")
@GeneratedValue
public Long
getAuthorId() {
return authorId;
}
public void setAuthorId(Long
authorId) {
this.authorId = authorId;
}
@Column(name="NAME")
public String getName()
{
return name;
}
public void setName(String
name) {
this.name = name;
}
@Column(name="EMAIL")
public String
getEmail() {
return email;
}
public void setEmail(String
email) {
this.email = email;
}
@OneToOne( mappedBy="author")
public Book getBook() {
return book;
}
public void setBook(Book
book) {
this.book = book;
}
}
BookManager.java
package
com.hibernate.practice.onetoone;
import java.util.Date;
import
org.hibernate.Session;
import
org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import
org.hibernate.service.ServiceRegistry;
import
org.hibernate.service.ServiceRegistryBuilder;
public class BookManager {
public static void main(String[]
args) {
// loads
configuration and mappings
Configuration configuration = new Configuration().configure();
ServiceRegistryBuilder registry = new
ServiceRegistryBuilder();
registry.applySettings(configuration.getProperties());
ServiceRegistry serviceRegistry =
registry.buildServiceRegistry();
// builds a session factory from the
service registry
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
// obtains the session
Session session =
sessionFactory.openSession();
session.beginTransaction();
// creates a Book entity
Book newBook = new Book();
newBook.setBookTitle("Effective
Java");
newBook.setBookDescription("A
Programming Language Guide (Java Series)");
newBook.setPublishedDate(new Date());
newBook.setAuthor(new Author("Joshua
Bloch", "Joshua@gmail.com"));
// persists the book entity
Long bookId = (Long)
session.save(newBook);
// gets the book entity back
Book book = (Book) session.get(Book.class, bookId);
System.out.println("Book's
Title: " + book.getBookTitle());
System.out.println("Book's
Description: " + book.getBookDescription());
Author author = book.getAuthor();
System.out.println("Author's
Name: " + author.getName());
System.out.println("Author's
Email: " + author.getEmail());
session.getTransaction().commit();
session.close();
}
}
Write XML configuration for database settings and mapping classes in the hibernate.cfg.xml file as follows:
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property>
<property name="hibernate.connection.username">PRACTICE</property>
<property name="hibernate.connection.password">PRACTICE</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="show_sql">true</property>
<!--Mapping Entity Starts -->
<mapping class="com.hibernate.practice.onetoone.Book"/>
<mapping class="com.hibernate.practice.onetoone.Author"/>
<!--Mapping Entity Ends -->
</session-factory>
</hibernate-configuration>
Output of the program:
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Book's Title: Effective Java
Book's Description: A Programming Language Guide (Java Series)
Author's Name: Joshua Bloch
Author's Email: Joshua@gmail.com
Hibernate: insert into AUTHOR (EMAIL, NAME, AUTHOR_ID) values (?, ?, ?)
Hibernate: insert into BOOK (AUTHOR_ID, DESCRIPTION, TITLE, PUBLISHED, BOOK_ID) values (?, ?, ?, ?, ?)
You may also like to read the below posts: