Java >> Java tutorial >  >> Tag >> hibernate

Hibernate Composite Primary Key Tutorial – Brug af composite-id tag &annotationer

Hvis en databasetabel har mere end én kolonne som primær nøgle så kalder vi det som sammensat primær nøgle . I denne dvale Sammensat primær nøgle tutorial, vil vi lære, hvordan du definerer sammensat primær nøgle ved hjælp af tag og annoteringer .

Hibernate Composite Primary Key Tutorial

Opretter tabel

Opret Medarbejder   Tabel skal du blot kopiere og indsætte følgende SQL-forespørgsel i forespørgselseditoren for at få tabellen oprettet.

CREATE TABLE "EMPLOYEE" 
   (
        "EMP_ID" NUMBER(10,0) NOT NULL ENABLE, 
	"EMP_NAME" VARCHAR2(255 CHAR), 
	"DEPARTMENT" VARCHAR2(255 CHAR), 
	PRIMARY KEY(EMP_ID,DEPARTMENT)
   );

Mappestruktur:

  1. Opret en simpel Maven  Projekt "HibernateTutorial" og opret en pakke til vores kildefiler com.javainterviewpoint under  src/main/java 
  2. Tilføj nu følgende afhængighed i 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>HibernateTutorial</groupId>
       <artifactId>HibernateTutorial</artifactId>
       <version>0.0.1-SNAPSHOT</version>
       <properties>
          <hibernate.version>4.3.11.Final</hibernate.version>
          <oracle.connector.version>11.2.0</oracle.connector.version>
       </properties>
    
       <dependencies>
         <!-- Hibernate -->
         <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
         </dependency>
    
         <!-- Oracle -->
         <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc14</artifactId>
            <version>${oracle.connector.version}</version>
         </dependency>
       </dependencies>
       <build>
         <sourceDirectory>src</sourceDirectory>
         <plugins>
           <plugin>
             <artifactId>maven-compiler-plugin</artifactId>
             <version>3.3</version>
             <configuration>
             <source>1.7</source>
             <target>1.7</target>
             </configuration>
           </plugin>
         </plugins>
       </build>
     </project>
  3. Opret Java-klasserne Employee.java  og CompositeKey_Example.java under  com.javainterviewpoint mappe.
  4. Placer employee.hbm.xml og hibernate.cfg.xml under src/main/resources    mappe

Dvale sammensat primær nøgle ved hjælp af XML Mapping

Employee.java

package com.javainterviewpoint;

import java.io.Serializable;

public class Employee implements Serializable
{
    private static final long serialVersionUID = 1L;
    
    private int empId;
    private String department;
    private String empName;
   
    public int getEmpId()
    {
        return empId;
    }
    public void setEmpId(int empId)
    {
        this.empId = empId;
    }
    public String getEmpName()
    {
        return empName;
    }
    public void setEmpName(String empName)
    {
        this.empName = empName;
    }
    public String getDepartment()
    {
        return department;
    }
    public void setDepartment(String department)
    {
        this.department = department;
    }
    @Override
    public String toString()
    {
        return "Employee [empId=" + empId + ", department=" + department + ", empName=" + empName + "]";
    }
    @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((department == null) ? 0 : department.hashCode());
        result = prime * result + empId;
        return result;
    }
    @Override
    public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Employee other = (Employee) obj;
        if (department == null)
        {
            if (other.department != null)
                return false;
        } else if (!department.equals(other.department))
            return false;
        if (empId != other.empId)
            return false;
        return true;
    }
}

Vores medarbejder  klasse er en simpel POJO klasse bestående af getterne og sættere for medarbejderen  klasseegenskaber (empId, empName, department) . For at implementere Composite Key i Hibernate skal vi tilsidesætte equals() og hashCode() metoden og implementerer også den Serialiserbare grænseflade.

employee.hbm.xml

Placer employee.hbm.xml fil under src/main/resources  mappe

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.javainterviewpoint">
 <class name="Employee" table="EMPLOYEE">
   <composite-id>
     <key-property name="empId" column="EMP_ID" />
     <key-property name="department" column="DEPARTMENT" />
   </composite-id>
   <property name="empName" column="EMP_NAME" />
 </class>
</hibernate-mapping>
  • "employee.hbm.xml" fortæller hibernate at kortlægge "Employee.class" med "Medarbejder" tabel i databasen.
  • Vi har et nyt tag tag tilføjet, som lader os kortlægge sammensat primær nøgle i dvale. Dette tag accepterer mapping, som indeholder den individuelle ejendom, der skal markeres som primær nøgle. I vores eksempel, empId og afdeling vil i fællesskab fungere som sammensat primær nøgle .
  • Ejendommen empName er tilknyttet EMP_NAME  kolonne i tabellen.

hibernate.cfg.xml

Placer hibernate.cfg.xml fil også under src/main/resources  mappe

 <?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>

 <!-- Database connection settings -->
 <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
 <property name="hibernate.connection.username">root</property>
 <property name="hibernate.connection.password">root</property>
 <property name="hibernate.connection.url">jdbc:oracle:thin:@mydb:40051:dev</property>

 <!-- JDBC connection pool (use the built-in) -->
 <property name="connection.pool_size">1</property>

 <!-- SQL dialect -->
 <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>

 <!-- Echo all executed SQL to stdout -->
 <property name="show_sql">true</property>

 <!-- Drop and re-create the database schema on startup -->
 <property name="hibernate.hbm2ddl.auto">update</property>

 <!-- Mapping resource file -->
 <mapping resource="employee.hbm.xml" />
</session-factory> 
</hibernate-configuration>
  • Først og fremmest er egenskaben til at specificere JDBC-driverklassen , i mit tilfælde er det OracleDriver
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
  • Angiv forbindelsens URL for at forbinde databasen og angive brugernavn og adgangskode til tilslutning af ovenstående database
<property name="hibernate.connection.url">jdbc:oracle:thin:@mydb:40051:dev</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
  • Angiv forbindelsens poolstørrelse , begrænser denne egenskab antallet af forbindelser i Hibernate-forbindelsespuljen.
<property name="connection.pool_size">1</property>
  • Dialekt Egenskaben får Hibernate til at generere SQL for den tilsvarende database, som bliver brugt. I dette eksempel bruger vi Oracle database og derfor Oracle-forespørgsel vil blive genereret. Hvis du bruger MySQL database, så skal du ændre dialekten tilsvarende.
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
  • show_sql egenskab vil udskrive den udførte sql i konsollen, når den er indstillet til true .
<property name="show_sql">true</property>
  • Hvis ejendommen “hibernate.hbm2ddl.auto” er indstillet til "opret" Dette vil falde og genskab databaseskemaet ved hver udførelse. Hvis den er indstillet til "opdater" så bliver databaseskemaet opdateret hver gang i stedet for at slippe og genskabe.
<property name="hibernate.hbm2ddl.auto">update</property>
  • Under Kortlægningsressourcen tag, skal vi angive alle de tilknytningsfiler, som vi har brug for, at tabellen skal oprettes eller opdateres for.
<mapping resource="employee.hbm.xml" />

CompositeKey_Example.java

package com.javainterviewpoint;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class CompositeKey_Example
{
           public static void main(String args[])
        {
            //Reading the hibernate configuration file
            Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
            StandardServiceRegistryBuilder regBuilber = new StandardServiceRegistryBuilder();
            regBuilber.applySettings(configuration.getProperties());
            ServiceRegistry serviceRegistry = regBuilber.build();
            
            //Create SessionFacctory
            SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
            
            //Create Session from SessionFactory
            Session session = sessionFactory.openSession();
            
            //Begin the transaction
            session.beginTransaction();
            
            //Create a new Employee object
            Employee employee = new Employee();
            //set value to its properties
            employee.setEmpId(1);
            employee.setDepartment("Blogging");
            employee.setEmpName("JavaInterviewPoint");
            
            session.save(employee);
            //Commit the changes
            session.getTransaction().commit();
            //Close the session
            session.close();
        }
}
  • Opret konfigurationen objekt og læs konfigurationsfilen ved hjælp af configure() metode.
Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
  • Hent SessionFactory objekt gennem buildSessionFactory() metode for konfigurationsobjektet.
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
  • openSession() metode åbner den nye session og begynder en ny transaktion
Session session = sessionFactory.openSession();
session.beginTransaction();
  • Opret medarbejder objekt og sæt værdier til dets egenskaber
Employee employee = new Employee();
employee.setEmpId(1);
employee.setDepartment("Blogging");
employee.setEmpName("JavaInterviewPoint");
  • gem() metoden for sessionsobjektet vedvarer  medarbejderen objekt
session.save(employee);
  • Få endelig transaktionen og forpligte ændringerne og luk sessionen.
session.getTransaction().commit();
session.close();

Konsol

INFO: HHH000261: Table found: EMPLOYEE
Mar 01, 2017 5:00:10 PM org.hibernate.tool.hbm2ddl.TableMetadata 
INFO: HHH000037: Columns: [department, emp_name, emp_id]
Mar 01, 2017 5:00:10 PM org.hibernate.tool.hbm2ddl.TableMetadata 
INFO: HHH000108: Foreign keys: []
Mar 01, 2017 5:00:10 PM org.hibernate.tool.hbm2ddl.TableMetadata 
INFO: HHH000126: Indexes: [sys_c0015248]
Mar 01, 2017 5:00:10 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000232: Schema update complete
Hibernate: insert into Employee (EMP_NAME, EMP_ID, DEPARTMENT) values (?, ?, ?)

Output

Dvale sammensat primær nøgle ved hjælp af annoteringer

Vi vil tilføje JPA Anmærkning til vores medarbejder  klasse.

package com.javainterviewpoint;

import java.io.Serializable;

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

@Entity
public class Employee implements Serializable
{
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue
    @Column(name="EMP_ID")
    private int empId;
    @Id
    @Column(name="DEPARTMENT")
    private String department;
    @Column(name="EMP_NAME")
    private String empName;
   
    public int getEmpId()
    {
        return empId;
    }
    public void setEmpId(int empId)
    {
        this.empId = empId;
    }
    public String getEmpName()
    {
        return empName;
    }
    public void setEmpName(String empName)
    {
        this.empName = empName;
    }
    public String getDepartment()
    {
        return department;
    }
    public void setDepartment(String department)
    {
        this.department = department;
    }
    @Override
    public String toString()
    {
        return "Employee [empId=" + empId + ", department=" + department + ", empName=" + empName + "]";
    }
    @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((department == null) ? 0 : department.hashCode());
        result = prime * result + empId;
        return result;
    }
    @Override
    public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Employee other = (Employee) obj;
        if (department == null)
        {
            if (other.department != null)
                return false;
        } else if (!department.equals(other.department))
            return false;
        if (empId != other.empId)
            return false;
        return true;
    }
}

Vi har brugt nedenstående JPA Annoteringer i vores Medarbejder  klasse

  1. @Entity – Denne annotation vil markere vores medarbejder klasse som en Entity Bean .
  2. @Tabel@Tabel annotation vil kortlægge vores klasse til den tilsvarende databasetabel. Du kan også angive andre attributter såsom indekser, katalog, skema, unikke begrænsninger . @Table annotation er en valgfri annotation, hvis denne annotation ikke er angivet, vil klassenavnet blive brugt som tabelnavn.
  3. @Id –  @Id annotering markerer det bestemte felt som den primære nøgle for Entiteten . For at definere en sammensat primærnøgle har vi brugt @Id annotation to gange(empId og afdeling ).
  4. @GeneratedValue – Denne annotation bruges til at specificere, hvordan den primære nøgle skal genereres. Her SEKVENS Strategi vil blive brugt, da dette er standardstrategien for Oracle
  5. @Kolonne – Denne annotation knytter de tilsvarende felter til deres respektive kolonner i databasetabellen.

Java tag