@ManyToOne

1. Create Tables


CREATE TABLE IF NOT EXISTS user_type (
  USER_TYPE_SID int(11) NOT NULL,
  USER_TYPE varchar(50) NOT NULL,
  OPRTNL_FLAG char(1) DEFAULT 'A',
  PRIMARY KEY (USER_TYPE_SID),
  UNIQUE KEY USER_TYPE (USER_TYPE)
) 

CREATE TABLE IF NOT EXISTS user_account (
  USER_SID int(11) NOT NULL AUTO_INCREMENT,
  USER_TYPE_SID int(11) NOT NULL DEFAULT '3',
  NAME varchar(50) NOT NULL,
  USERNAME varchar(50) NOT NULL,
  PASSWORD varchar(50) NOT NULL,
  EMAIL_ID varchar(100) DEFAULT NULL,
  OPRTNL_FLAG char(1) DEFAULT 'A',
  CREATED_BY int(10) DEFAULT '1',
  ACTIVE_CODE varchar(20) NOT NULL,
  PRIMARY KEY (USER_SID),
  UNIQUE KEY USERNAME (USERNAME),
  KEY USER_TYPE_CID_FK (USER_TYPE_SID)
) 

2. Entity Classes (UserType, UserDetail)

UserType.java


package com.spin.view;

import javax.persistence.Column;
import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.Table;

@Entity
@Table (name="user_type")
public class UserType {
	
	//in this table, id is primary key.
	@Id
	@Column(name="USER_TYPE_SID")
	private Long userTypeId;
	
	@Column(name="USER_TYPE", length=50, nullable=false)
	private String userType;
	
	@Column(name="OPRTNL_FLAG", length=1, nullable=false)
	private String oprtnlFlag="A";


	@Override
	public String toString() {
		return "UserType [userTypeId=" + userTypeId + ", userType=" + userType + ", oprtnlFlag=" + oprtnlFlag + "]";
	}
	public String getOprtnlFlag() {
		return oprtnlFlag;
	}
	public void setOprtnlFlag(String oprtnlFlag) {
		this.oprtnlFlag = oprtnlFlag;
	}

	public Long getUserTypeId() {
		return userTypeId;
	}
	public void setUserTypeId(Long userTypeId) {
		this.userTypeId = userTypeId;
	}

	public String getUserType(){
		return userType;
	}
	public void setUserType(String userType){
		this.userType=userType;
	}

}

UserDetail.java


package com.spin.view;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table (name="USER_ACCOUNT")
public class UserDetail {

	@Id
	@Column(name="USER_SID", nullable=false)
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Long userId;
	
	@JoinColumn(name="USER_SID",referencedColumnName="USER_TYPE_SID",insertable=false,updatable=false)
	@ManyToOne(fetch = FetchType.LAZY) // this column is foreign key , so addition Relationship
	private UserType userType;
	
	@Column(name="NAME", nullable=false)
	private String name;
	
	@Column(name="USERNAME", nullable=false)
	private String userName;
	
	@Column(name="PASSWORD", nullable=false)
	private String passWord;
	
	@Column(name="EMAIL_ID", nullable=true)
	private String emailId;
	
	@Column(name="OPRTNL_FLAG", nullable=true)
	private String oprnlFlag = "A";
	
	@Column(name="CREATED_BY", nullable=true)
	private Long createdBy;
	
	@Column(name="ACTIVE_CODE", nullable=false)
	private String activationCode = "SPINSOFT";

	public Long getUserId() {
		return userId;
	}

	public void setUserId(Long userId) {
		this.userId = userId;
	}

	public UserType getUserType() {
		return userType;
	}

	public void setUserType(UserType userType) {
		this.userType = userType;
	}

	public String getName() {
		return name;
	}

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

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassWord() {
		return passWord;
	}

	public void setPassWord(String passWord) {
		this.passWord = passWord;
	}

	public String getEmailId() {
		return emailId;
	}

	public void setEmailId(String emailId) {
		this.emailId = emailId;
	}

	public String getOprnlFlag() {
		return oprnlFlag;
	}

	public void setOprnlFlag(String oprnlFlag) {
		this.oprnlFlag = oprnlFlag;
	}

	public Long getCreatedBy() {
		return createdBy;
	}

	public void setCreatedBy(Long createdBy) {
		this.createdBy = createdBy;
	}

	public String getActivationCode() {
		return activationCode;
	}

	public void setActivationCode(String activationCode) {
		this.activationCode = activationCode;
	}

	@Override
	public String toString() {
		return "UserDetail [userId=" + userId + ", userType=" + userType + ", name=" + name + ", userName=" + userName
				+ ", passWord=" + passWord + ", emailId=" + emailId + ", oprnlFlag=" + oprnlFlag + ", createdBy="
				+ createdBy + ", activationCode=" + activationCode + "]";
	}

	

	
}

Hibernate JPA – CRUD

1. Create Table


CREATE TABLE USER_DETAIL ( USER_ID INTEGER PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(100) NOT NULL );

2. Create Entity Class


package com.sridhar.taskapp.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
 
@Entity
@Table(name="user_detail")
public class UserDetail {
 
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY ) //strategy=GenerationType.AUTO )
    @Column(name="USER_ID")
    private Long id;
     
    @Column(name="NAME", length=50 , nullable=false)
    private String name;
 
    public Long getId() {
        return id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
     
}

3. Create persistence.xml [ Save it in src/META-INF/persistence.xml ]


<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
    version="2.0">
    <persistence-unit name="TaskAppJPA"
        transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>com.spinsoft.taskapp.view.UserDetail</class>
        <properties>
            <property name="javax.persistence.jdbc.driver"
                value="com.mysql.jdbc.Driver"></property>
            <property name="javax.persistence.jdbc.url"
                value="jdbc:mysql://localhost/spindb"></property>
            <property name="javax.persistence.jdbc.user" value="root"></property>
            <property name="javax.persistence.jdbc.password" value=""></property>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

4. Test Class:


package com.sridhar.taskapp.util;
 
import java.util.List;
 
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
 
import com.spinsoft.taskapp.domain.UserDetail;
 
public class TestUserDetailDAO {
 
    public static void insert() {
 
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("TaskAppJPA");
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        UserDetail userDetail = new UserDetail();
        userDetail.setName("Siva");
        em.persist(userDetail);
        em.getTransaction().commit();
        em.close();
        emf.close();
 
    }
 
    public static void update(UserDetail userDetail) {
 
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("TaskAppJPA");
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        em.merge(userDetail);
        em.getTransaction().commit();
        em.close();
        emf.close();
 
    }
 
    public static void main(String[] args) {
 
        list();
        insert();
        list();
        UserDetail userDetail = findByName("Siva");
        userDetail.setName("Siva Kumar");
        update(userDetail);
        delete(userDetail.getId());
        list();
 
    }
 
    private static void list() {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("TaskAppJPA");
        EntityManager em = emf.createEntityManager();
        List<UserDetail> emps = em.createQuery("SELECT e FROM UserDetail e", UserDetail.class).getResultList();
        for (UserDetail e : emps) {
            System.out.println(e.getId() + ", " + e.getName());
        }
        em.close();
        emf.close();
    }
 
    public static UserDetail findById(Long id) {
 
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("TaskAppJPA");
        EntityManager em = emf.createEntityManager();
        TypedQuery<UserDetail> query = em.createQuery("SELECT e FROM UserDetail e where id=?", UserDetail.class);
        query.setParameter(1, id);
        UserDetail userDetail = query.getSingleResult();
        em.close();
        emf.close();
 
        return userDetail;
 
    }
 
    public static UserDetail findByName(String name) {
 
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("TaskAppJPA");
        EntityManager em = emf.createEntityManager();
        TypedQuery<UserDetail> query = em.createQuery("SELECT e FROM UserDetail e where name=?", UserDetail.class);
        query.setParameter(1, name);
        UserDetail userDetail = query.getSingleResult();
        em.close();
        emf.close();
 
        return userDetail;
 
    }
 
    public static UserDetail findOne(Long id) {
 
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("TaskAppJPA");
        EntityManager em = emf.createEntityManager();
        UserDetail userDetail = em.find(UserDetail.class, id);
        return userDetail;
 
    }
 
    public static void delete(Long id) {
 
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("TaskAppJPA");
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        UserDetail userDetail = findOne(id);
        em.remove(em.merge(userDetail));
        em.getTransaction().commit();
        em.close();
        emf.close();
 
    }
 
}

Hibernate Validator

1. Create a domain class – User


package com.sridhar.taskapp;
 
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
 
public class User {
 
    private Long id;
 
    @Size(min = 3, max = 20)
    @NotNull(message = "Name cannot be null")
    private String name;
 
    @Pattern(regexp = ".+@.+\\.[a-z]+", message = "Invalid EmailId")
    private String email;
 
    public String getEmail() {
        return email;
    }
 
    public void setEmail(String email) {
        this.email = email;
    }
 
    public Long getId() {
        return id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", email=" + email + "]";
    }
 
}

2. Create a Test Class


package com.sridhar.taskapp;
 
import java.util.Set;
 
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
 
public class TestUser {
 
    public static void main(String[] args) {
 
        User user = new User();
 
        user.setId(1L);
        user.setName("abc");
        user.setEmail("Sridhar");
 
        System.out.println(user);
 
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
 
        Set<ConstraintViolation<User>> violations = validator.validate(user);
 
        for (ConstraintViolation<User> violation : violations) {
            String fieldName = violation.getPropertyPath().toString();
            String message = violation.getMessage();
 
            System.out.println( fieldName + " : " + message );
        }
 
    }
}

JPA – Persistence Annotations

Most used JPA Annotations

Entity Beans with @Entity

Primary Keys with @Id and @GeneratedValue

Generating Primary Key Values with @SequenceGenerator

Generating Primary Key Values with @TableGenerator

Compound Primary Keys with @Id, @IdClass, or @EmbeddedId

Database Table Mapping with @Table and @SecondaryTable

Persisting Basic Types with @Basic

Omitting Persistence with @Transient

Mapping Properties and Fields with @Column

Modeling Entity Relationships

Modeling @OneToOne relationship

Modeling @OneToMany relationship

Modeling @ManyToMany relationship

Mapping Inheritance Hierarchies

Single Table – @Inheritance(strategy = SINGLE_TABLE)

Joined Table @Inheritance(strategy = JOINED)

Table per Concrete Class @Inheritance(strategy = TABLE_PER_CLASS)

Other JPA 2 Persistence Annotations

Temporal Data with @Temporal

Element Collections with @ElementCollection

Hibernate – java.util.Date

persistence.xml


<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
	version="2.0">

	<persistence-unit name="HibernateDemo"
		transaction-type="RESOURCE_LOCAL">
		<properties>
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"></property>
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/collegedb"></property>
			<property name="javax.persistence.jdbc.user" value="root"></property>
			<property name="javax.persistence.jdbc.password" value=""></property>
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
			<property name="hibernate.show_sql" value="true" />
		</properties>
	</persistence-unit>

</persistence>

CollegeMaster.java


package com.sridhar.hibernate.view;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name="collegeDetail")
public class CollegeMaster {

	@Id
	@Column(name="COLLEGE_CODE")
	@GeneratedValue(strategy= GenerationType.IDENTITY)
	private String collegeCode;

	@Column(name="COLLEGE_NAME")
	private String collegeName;
	//used to map the appropriate database types when persisting to the database.
	@Temporal(TemporalType.DATE) 
	@Column(name="ESTA_DATE")
	private Date establishedDate;

	public String getCollegeCode() {
		return collegeCode;
	}

	public void setCollegeCode(String collegeCode) {
		this.collegeCode = collegeCode;
	}

	public String getCollegeName() {
		return collegeName;
	}

	public void setCollegeName(String collegeName) {
		this.collegeName = collegeName;
	}

	public Date getEstablishedDate() {
		return establishedDate;
	}

	public void setEstablishedDate(Date establishedDate) {
		this.establishedDate = establishedDate;
	}

	@Override
	public String toString() {
		return "CollegeMaster [collegeCode=" + collegeCode + ", collegeName=" + collegeName + ", establishedDate="
				+ establishedDate + "]";
	}

}

TestCollegeMaster.java


package com.sridhar.hibernate.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import com.sridhar.hibernate.view.CollegeMaster;

public class TestCollegeMaster {

	public static void main(String[] args) throws ParseException {
		CollegeMaster collegeMaster = new CollegeMaster();

		//college.setCollegeCode("1001");
		collegeMaster.setCollegeName("Bharathiyar University");
		String estaDateString="09/03/2016";  
		SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");                       
		java.sql.Date estaDate= new java.sql.Date(format.parse(estaDateString).getTime());
		collegeMaster.setEstablishedDate(estaDate);
		insert(collegeMaster);

	}

	private static void insert(CollegeMaster collegeMaster) {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("HibernateDemo");
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
		em.persist(collegeMaster);
		em.getTransaction().commit();
		em.close();
		emf.close();

	}

}

Hibernate – LocalDate value

persistence.xml


<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
	version="2.0">

	<persistence-unit name="HibernateDemo"
		transaction-type="RESOURCE_LOCAL">
		<properties>
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"></property>
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/collegedb"></property>
			<property name="javax.persistence.jdbc.user" value="root"></property>
			<property name="javax.persistence.jdbc.password" value=""></property>
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
			<property name="hibernate.show_sql" value="true" />
		</properties>
	</persistence-unit>

</persistence>

CollegeMaster.java


package com.sridhar.hibernate.view;

import java.time.LocalDate;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="collegeDetail")
public class CollegeMaster {

	@Id
	@Column(name="COLLEGE_CODE")
	@GeneratedValue(strategy= GenerationType.IDENTITY)
	private String collegeCode;

	@Column(name="COLLEGE_NAME")
	private String collegeName;

	@Column(name="ESTA_DATE")
	private LocalDate establishedDate;

	public String getCollegeCode() {
		return collegeCode;
	}

	public void setCollegeCode(String collegeCode) {
		this.collegeCode = collegeCode;
	}

	public String getCollegeName() {
		return collegeName;
	}

	public void setCollegeName(String collegeName) {
		this.collegeName = collegeName;
	}

	public LocalDate getEstablishedDate() {
		return establishedDate;
	}

	public void setEstablishedDate(LocalDate establishedDate) {
		this.establishedDate = establishedDate;
	}

	@Override
	public String toString() {
		return "CollegeMaster [collegeCode=" + collegeCode + ", collegeName=" + collegeName + ", establishedDate="
				+ establishedDate + "]";
	}

}

TestCollegeMaster.java


package com.sridhar.hibernate.Test;

import java.time.LocalDate;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import com.sridhar.hibernate.view.CollegeMaster;

public class TestCollegeMaster {
	
	public static void main(String[] args) {
		CollegeMaster collegeMaster = new CollegeMaster();
		collegeMaster.setCollegeName("Sathyabama University");
		
		//Handling LocalDate
		LocalDate estaDate = LocalDate.parse("2015-06-20");
		collegeMaster.setEstablishedDate(estaDate);
		insert(collegeMaster);

	}

	private static void insert(CollegeMaster collegeMaster) {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("HibernateDemo");
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
			em.persist(collegeMaster);
		em.getTransaction().commit();
		em.close();
		emf.close();
		
	}

}