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
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:
- Opret en simpel Maven Projekt "HibernateTutorial" og opret en pakke til vores kildefiler “com.javainterviewpoint ” under src/main/java
- 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>
- Opret Java-klasserne Employee.java og CompositeKey_Example.java under com.javainterviewpoint mappe.
- 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
- @Entity – Denne annotation vil markere vores medarbejder klasse som en Entity Bean .
- @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.
- @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 ).
- @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
- @Kolonne – Denne annotation knytter de tilsvarende felter til deres respektive kolonner i databasetabellen.