Embedded Compound Primary Key : Primary Key « JPA « Java Tutorial






File: Student.java

import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;

@Entity
public class Student implements java.io.Serializable {
    @EmbeddedId
    private StudentId id;
    private String name;


    public Student() {}
    public Student(String country, int id) {
        this.id = new StudentId(country, id);
    }

    public int getId() {
        return id.getId();
    }

    public String getCountry() {
        return id.getCountry();
    }

    public String getName() {
        return name;
    }

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


    public String toString() {
        return "Student id: " + getId() + " name: " + getName() + " country: " + getCountry();
    }
}

@Embeddable
class StudentId  implements java.io.Serializable{
    private String country; 
    @Column(name="Student_ID")
    private int id; 

    public StudentId() {}
    public StudentId(String country, int id) {
        this.country = country;
        this.id = id;
    }


    public String getCountry() { return country; }
    public int getId() { return id; }

    public boolean equals(Object o) { 
        return ((o instanceof StudentId) && 
                country.equals(((StudentId)o).getCountry()) &&
                id == ((StudentId) o).getId());

    }

    public int hashCode() { 
        return country.hashCode() + id; 
    }
}

File: Helper.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;

public class Helper {
  public static void checkData() throws Exception {
    Class.forName("org.hsqldb.jdbcDriver");
    Connection conn = DriverManager.getConnection("jdbc:hsqldb:data/tutorial", "sa", "");
    Statement st = conn.createStatement();

    ResultSet mrs = conn.getMetaData().getTables(null, null, null, new String[] { "TABLE" });
    while (mrs.next()) {
      String tableName = mrs.getString(3);
      System.out.println("\n\n\n\nTable Name: "+ tableName);

      ResultSet rs = st.executeQuery("select * from " + tableName);
      ResultSetMetaData metadata = rs.getMetaData();
      while (rs.next()) {
        System.out.println(" Row:");
        for (int i = 0; i < metadata.getColumnCount(); i++) {
          System.out.println("    Column Name: "+ metadata.getColumnLabel(i + 1)+ ",  ");
          System.out.println("    Column Type: "+ metadata.getColumnTypeName(i + 1)+ ":  ");
          Object value = rs.getObject(i + 1);
          System.out.println("    Column Value: "+value+"\n");
        }
      }
    }
  }
}

File: Main.java

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

public class Main {
  static EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPAService");

  static EntityManager em = emf.createEntityManager();

  public static void main(String[] a) throws Exception {
    em.getTransaction().begin();

    Student student = new Student("USA", 1);
    student.setName("name");
    em.persist(student);

    student = (Student) em.createQuery(
        "SELECT e " + "FROM Student e " + "WHERE e.id.country = ?1 AND e.id.id = ?2").setParameter(
        1, "USA").setParameter(2, 1).getSingleResult();

    em.getTransaction().commit();
    em.close();
    emf.close();

    Helper.checkData();
  }
}

File: persistence.xml

<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" version="1.0">
  <persistence-unit name="JPAService" transaction-type="RESOURCE_LOCAL">
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
      <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
      <property name="hibernate.connection.username" value="sa"/>
      <property name="hibernate.connection.password" value=""/>
      <property name="hibernate.connection.url" value="jdbc:hsqldb:data/tutorial"/>
    </properties>
  </persistence-unit>
</persistence>
  Download:  JPA-EmbeddedCompoundPrimaryKey.zip( 5,289 k)








22.19.Primary Key
22.19.1.Use UUID As Primary Key
22.19.2.Use Current Milisecond As ID
22.19.3.Set Primary Key Join Column For Entities In Hierarchy
22.19.4.Set ID By Yourself
22.19.5.Not Nullable ID
22.19.6.ID Entity With Hash Code And Equals
22.19.7.Id Containing Relationship
22.19.8.Embedded Compound Primary Key
22.19.9.Define Extra Class For Compound Key