Schau nach Hibernate

1- Die Vorstellung

Das ist ein Unterlagen zum Nachschlagen einiger Fragen über   Hibernate. Sie sollen das folgende Unterlagen vorschauen um leicht zu studieren

2- Die Bibliothek zur Verwaltung der Database herunterladen

Wenn Sie mit einer DB arbeiten, brauchen Sie die Bibliothek zur Kontroll dieser DB 
  • Oracle
  • MySQL
  • SQLServer
  • HSQL
  • ....
Mehr sehen
Das Ergebnis schaffen wir

3- Hibernate auf die unterschiedlichen DB konfigurieren

3.1- Hibernate für Oracle konfigurieren

Zuerst müssen Sie die Bibliothek zur Kontrolle der Oracle Database erklären (Die Anleitung oben).
Hibernate ​​​​​​​konfigurieren:
hibernate.cfg.xml (Oracle)
<?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="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>  
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:db11g</property>    
<property name="connection.username">simplehr</property>
<property name="connection.password">1234</property>


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

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

<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>


<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">create-drop</property>


 <mapping class="org.o7planning.tutorial.hibernate.entities.Department" />
 <mapping class="org.o7planning.tutorial.hibernate.entities.Employee" />
 <mapping class="org.o7planning.tutorial.hibernate.entities.SalaryGrade" />
 <mapping class="org.o7planning.tutorial.hibernate.entities.Timekeeper" />

</session-factory>
</hibernate-configuration>

3.2- Hibernate für MySQL konfigurieren

Zuerst sollen Sie die Bibliothek zur Kotrolle der MySQL Database erklären (die Anleitung oben).
Hibernate ​​​​​​​konfigurieren
hibernate.cfg.xml (MySQL)
<?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="connection.driver_class">com.mysql.jdbc.Driver</property>
 <property name="connection.url">jdbc:mysql://tran-vmware:3306/simplehr</property>
 <property name="connection.username">root</property>
 <property name="connection.password">1234</property>

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

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

 <!-- Enable Hibernate's automatic session context management -->
 <property name="current_session_context_class">thread</property>

 <!-- Disable the second-level cache  -->
 <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

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

  <mapping class="org.o7planning.tutorial.hibernate.entities.Department" />
  <mapping class="org.o7planning.tutorial.hibernate.entities.Employee" />
  <mapping class="org.o7planning.tutorial.hibernate.entities.SalaryGrade" />
  <mapping class="org.o7planning.tutorial.hibernate.entities.Timekeeper" />

</session-factory>
</hibernate-configuration>

3.3- Hibernate für SQL Server konfigurieren

Zuerst sollen Sie die Bibliothek zur Kontroll der Database SQLServer (die Anleitung oben) erklären

Hibernate konfigurieren (die Bibliothek   JTDS ​​​​​​​benutzen)
hibernate.cfg.xml (SQL Server)
<?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="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
  <property name="connection.url">jdbc:jtds:sqlserver://localhost:1433/simplehr;instance=SQLEXPRESS</property>
  <property name="connection.username">sa</property>
  <property name="connection.password">1234</property>

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

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

  <!-- Enable Hibernate's automatic session context management -->
  <property name="current_session_context_class">thread</property>

  <!-- Disable the second-level cache  -->
  <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

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

   <mapping class="org.o7planning.tutorial.hibernate.entities.Department" />
   <mapping class="org.o7planning.tutorial.hibernate.entities.Employee" />
   <mapping class="org.o7planning.tutorial.hibernate.entities.SalaryGrade" />
   <mapping class="org.o7planning.tutorial.hibernate.entities.Timekeeper" />

</session-factory>
</hibernate-configuration>

4- Hibernate & Java Persistence Annotation

Hibernate benutzt die Annotation zur Informationbezeichnung für ein  Entity. Sie kann auch die Annotation im API vom hibernate in der Package von org.hibernate.annotations benutzen. Oder benutzen Sie die Annotation in der Package von javax.persistence vom  Java Persistence API. In der Praxis werden die  Annotation vom  Java Persistence API mehr beliebt
In diesem Teil liste ich die üblichen Annotation vom Java Persistence API, die für   Entity ​​​​​​​kommentieren.
 

4.1- @Entity

@Entity wird benutzt um eine Klasse als ein  Entity zu annotieren.
// Phần tử (element) name của @Entity là không bắt buộc.
// Việc chỉ định rõ name của @Entity cho phép viết ngắn câu HSQL

@Entity
@Table(name = "ACCOUNT")
public class Account implements Serializable {
    
}

// Phần tử (element) name của @Entity là không bắt buộc.
// Entity khớp với một bảng lấy theo tên theo thứ tự ưu tiên:
//  1 - name trong @Table
//  2 - name trong @Entity
//  3 - name của class.
// Việc chỉ định rõ name của @Entity cho phép viết ngắn câu HSQL

@Entity(name="AccTransaction")
@Table(name = "ACC_TRANSACTION")
public class AccTransaction implements Serializable {

}
 
Die Festlegung der Element name vom  @Entity hilft Sie bei der Verkürzung des Befehl HSQL. Sehen Sie das Beispiel
// @Entity chú thích trên class Account không chỉ định rõ phần tử name.
// Vì vậy câu HSQL bắt buộc phải viết:

String hsql1 = "Select o from "+ Account.class.getName() +" o ";


// @Entity chú thích trên class AccTransaction
// chỉ định rõ phần tử name = "AccTransaction"
// Vì vậy câu HSQL có thể viết ngắn gọn:

String hsql2 = "Select o from AccTransaction o";

4.2- @Table

Eine Table im  DB kann die einzigen Zwangen (constrain). @Table erlaubt Sie, diese zu kommentieren
// @Table cho phép chú thích tên bảng
// Các giàng buộc duy nhất trong bảng.
// Phần tử name không bắt buộc.
// Nếu bạn không chỉ rõ tên bảng trong phần tử name ...
// .. Hibernate sẽ dựa vào phần tử name của @Entity sau đó mới
// tới tên của class.

@Table( name = "invoice_header",
           uniqueConstraints = @UniqueConstraint(columnNames ={ "invoice_num" }   )
)
@Entity
public class InvoiceHeader  implements java.io.Serializable {

       private String invoiceNum;


      @Column(name = "invoice_num", nullable = false, length = 20)
      public String getInvoiceNum() {
          return this.invoiceNum;
      }

}

4.3- @Id

zum Beispiel:  @Id nimmt an die Annotation ID (Identity) von  Entity teil. Es ist so ähnlich wie verstanden,dass die Spalte der Hauptschlüssel der Tabelle ( Primary Key) ist.
@Entity
@Table(name = "EMPLOYEE")
public class Employee implements Serializable {

    private Integer empId;

    // @Id chú thích đây là id của Entity.
    // Và EMP_ID chính là khóa chính (Primary Key) của bảng.

    @Id
    @GeneratedValue
    @Column(name = "EMP_ID")
    public Integer getEmpId() {
        return empId;
    }

     ......
}

4.4- @GeneratedValue

@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface GeneratedValue {

  // GenerationType: AUTO, TABLE, SEQUENCE, IDENTITY
  GenerationType strategy() default AUTO;

  String generator() default "";

}
@GeneratedValue wird kommentiert, damit   Hibernate die Wert automatisch erstellt und die Wert in eine Spalte zuweist bei der Durchführung von insert eines neuen  Entity in database. Es kann auf ID Spalte oder eine andere Spalte zuweisen

Manchmal wird es mit @Generator kommentiert

4.4.1- GenerationType.AUTO

// Chú thích @GeneratedValue tương đương với
// @GeneratedValue(strategy=GenerationType.AUTO)

@GeneratedValue
@Id
@Column(name = "EMP_ID")
public Integer getEmpId() {
    return empId;
}
Die Spalte, die durch @GeneratedValue(strategy= AUTO) annotiert wird, wird die Wert automatisch zugewiesen. Die Wert wird durch  SEQUENCE erstellt oder selbst erhöht (wenn die Spalte ist IDENTITY Typ). Es hängt von DB ​​​​​​​ab.
Mit  Oracle, Postgres wird Hibernate eine  Sequence mit dem Name  vom  Hibernate_Sequence um eine erhöhende Wert zu erstellen. Mit der anderen DB wie  MySQL, DB2, SQL Server, Sysbase sind die Spalte   IDENTITY Typ und ihre Wert erhöht sich selbst

4.4.2- GenerationType.IDENTITY

Die Spalte mit dem IDENTITY Typ wird nur durch einige DB unterstützt, nicht alle DB,z. B  MySQL, DB2, SQL Server, Sybase und Postgres. Oracle unterstützen die Spaltentyp nicht
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Id
@Column(name = "EMP_ID")
public Integer getEmpId() {
   return empId;
}

4.4.3- GenerationType.SEQUENCE

SEQUENCE ist ein Objekt in DB, speichert eine nach jeder Aufruf steigende Wert und wird durch  Oracle, DB2, und  Postgres unterstützt
@GeneratedValue(strategy=GenerationType.SEQUENCE)
@Id
@Column(name = "EMP_ID")
public Integer getEmpId() {
   return empId;
}

4.4.4- GenerationType.TABLE

@Entity
public class Employee {
    ...
    @TableGenerator(
        name="empGen",
        table="ID_GEN_TABLE",
        pkColumnName="KEY_COLUMN",
        valueColumnName="VALUE_COLUMN",
        pkColumnValue="EMP_ID",
        allocationSize=1)
    @Id
    @GeneratedValue(strategy=TABLE, generator="empGen")
    public Long getEmpId()  {
       return empId;
    }
    ...
}


@Entity
public class Department {
    ...
    @TableGenerator(
        name="deptGen",
        table="ID_GEN_TABLE",
        pkColumnName="KEY_COLUMN",
        valueColumnName="VALUE_COLUMN",
        pkColumnValue="DEPT_ID",
        allocationSize=1)
    @Id
    @GeneratedValue(strategy=TABLE, generator="deptGen")
    public Long getDeptId()  {
       return deptId;
    }
    ...
}
 

Achtung: Sie können den Name der Tabelle und der Spalte anpassen (ID_GEN_TABLE, KEY_COLUMN, VALUE_COLUMN)

4.4.5- UUID

UUID ist eine Klasse vom Java, damit Sie ein random 36 Zeichen String erstellen können. Und mit 36 Zeichen passiert die Übereinstimmung zu wenig

Sie können auch kommentieren damit  Hibernate ein random String erstellen
 // Sử dụng strategy = "uuid2".

@GenericGenerator(name="my-uuid", strategy = "uuid2")
@GeneratedValue(generator="my-uuid")
@Id
@Column(name = "EMP_ID", length = 36)
public String getEmpId()  {
   return empId;
}

4.5- @Column

@Column kommentiert für eine Spalte, umfassend die Länge der Spalte, erlaubt sie  null oder nicht
// Đây là một cột kiểu chuỗi, vì thế length luôn có ý nghĩa và cần thiết
// nullable mặc định là true
// length mặc định là 255

@Column(name = "FIRST_NAME", length = 20, nullable = false)
public String getFirstName() {
    return firstName;
}


// @Column không chỉ rõ phần tử length, mặc định nó là 255.

@Column(name = "DESCRIPTION", nullable = true )
public String getDescription() {
    return firstName;
}

// Với các cột kiểu số hoặc Date bạn có thể bỏ qua length
// (Nó không có ý nghĩa trong trường hợp này).

@Column(name = "PENDING_BALANCE")
public Float getPendingBalance() {
    return pendingBalance;
}




 

4.6- @Lob

@Lob ist normalerweise mit @Column kommentiert um zu informieren, dass die Spalte BLOB oder  CLOB ist
// Chú ý rằng trong một số Database có phân biệt TINY, MEDIUM, LARGE BLOB/CLOB.
// Còn một số database thì không.
// Phần tử length trong @Column trong trường hợp này sẽ quyết định nó map
// vào BLOB/CLOB nào.
// Trong trường hợp cho phép BLOB/CLOB tối đa hãy để length = Integer.MAX_VALUE


// Method này trả về byte[]
// @Lob trong trường hợp này chú thích cho cột BLOB

@Lob
@Column(name = "IMAGE_VALUE", nullable = true, length = Integer.MAX_VALUE)
public byte[] getImageValue() {
    this.imageValue;
}

// Method này trả về String
// @Lob trong trường hợp này sẽ chú thích cho CLOB.

@Lob
@Column(name = "ARTICLE_CONTENT", nullable = true, length = Integer.MAX_VALUE)
public String getArticleContent() {
    this.articleContent;
}

4.7- @Temporal

@Temporal ist benutzt um die Datenspalte für Datum und Zeit zu annotieren (date time).
// @Temporal sử dụng chú thích cho cột có kiểu dữ liệu ngày tháng.
// Có 3 giá trị cho TemporalType:
// 1 - TemporalType.DATE
// 2 - TemporalType.TIME
// 3 - TemporalType.TIMESTAMP

@Temporal(TemporalType.DATE)
@Column(name = "START_DATE", nullable = false)
public java.util.Date getStartDate() {
    return startDate;
}

// TemporalType.DATE chú thích cột sẽ lưu trữ ngày tháng năm (bỏ đi thời gian)
// TemporalType.TIME chú thích cột sẽ lưu trữ thời gian (Giờ phút giây)
// TemporalType.TIMESTAMP chú thích cột sẽ lưu trữ ngày tháng và cả thời gian

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "FUNDS_AVAIL_DATE", nullable = false)
public java.util.Date getFundsAvailDate() {
      return fundsAvailDate;
}

4.8- @ManyToOne

@ManyToOne bezeichnet die Beziehung N-1 (mehr - ein), die mit  @JoinColumn normalerweise benutzt wird
@Entity
@Table(name = "ACCOUNT")
public class Account implements Serializable {

 
    private Branch openBranch;
 
   // Phần tử foreignKey giúp chỉ rõ tên Foreign Key trong DB.
   // Điều này sẽ giúp Hibernate tạo ra DB từ các Entity java một cách chính xác hơn.

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "OPEN_BRANCH_ID", nullable = false,
                 foreignKey = @ForeignKey(name = "ACCOUNT_BRANCH_FK"))
    public Branch getOpenBranch() {
        return openBranch;
    }

}
Hibernate hat die Tools, damit Sie die Klasse Entity aus der Tabelle in   Database. Und  Hibernate erlaubt Sie bei der Erstellung der Tabelle aus der Klasse  Entity, umfassend die Zwang zwischen die Tabelle (Foreign Key). Die Annotation @ForeignKey erlaubt den Name vom Foreign Key zu bestimmen, der erstellt werden wird
@ForeignKey wird in JPA aus der Version von  2.1 eingeführt
// Phần tử fetch có 2 giá trị
// 1 - FetchType.LAZY
// 2 - FetchType.EAGER

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "OPEN_BRANCH_ID", nullable = false,
             foreignKey = @ForeignKey(name = "ACCOUNT_BRANCH_FK"))
public Branch getOpenBranch() {
    return openBranch;
}

LAZY:

LAZY sagt Hibernate dass, bitte laden Sie die Daten faul herunter.
Zum Beispiel haben Sie ein Objekt  Account, und rufen die Methode  getOpenBranch() auf. Sie gibt ein Objekt Branch zurück,. Im Objekt  Branch wird der Felder (field) branchId die Wert nur zugewiesen, die anderen Felder nicht.

In der Praxis ladet  hibernate die Daten aus dem entsprechenden Rekord von der Tabelle BRANCH in diesem Objekt nicht herunter. Es frägt die Daten nur ab wenn Sie etwas mit dem Objekt   Branch machen, z.B die Aufruf von der Methode  branch.getName().

EAGER:

EAGER sagt mit  Hibernate , alle Spalten der betreffenden Tabellen abzufragen
Zum Beispiel: Sie haben das Objekt  Account und rufen die Methode  getOpenBranch() auf. Sie gibt das Objekt  Branch mit der Wert für die Felder ( name, address, ...) zurück. In der Praxis wird ihre Daten in der gleichen Abfragen mit der Tablle Account geschafft
Sie sollen LAZY staat des  EAGER wegen der Programmleistung benutzen

4.9- @OneToMany

@OneToMany ist die Annotation zur Aufnahme der Liste von den Sub-Rekorde des momentan Rekord (Das ist eine einseitige Beziehung). Es ist die Reverse von der Annotation von  @ManyToOne, und deshalb basiert es auf die Annotation @ManyToOne um @OneToMany zu definieren.
@Entity
@Table(name = "EMPLOYEE")
public class Employee implements Serializable {

    ....

    private Department department;
 
    // Quan hệ N-1 (Nhiều - Một) định nghĩa department.   

    @JoinColumn(name = "DEPT_ID", nullable = true,
              foreignKey = @ForeignKey(name = "EMPLOYEE_DEPARTMENT_FK"))    
    @ManyToOne(fetch = FetchType.LAZY)    
    public Department getDepartment() {
        return department;
    }
 

}



@Entity
@Table(name = "DEPARTMENT")
public class Department implements Serializable {

        .....

    private Set<Employee> employees = new HashSet<Employee>(0);

    // Quan hệ 1-N (Một - Nhiều) sử dụng mappedBy = "department"
    // đã định nghĩa ở quan hệ N-1 (phía trên).

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "department")
    public Set<Employee> getEmployees() {
        return employees;
    }
}

4.10- @OrderBy

@OrderBy ist zur Aufgliederung einer Kollektion. Deshalb wird es mit @OneToMany ​​​​​​​benutzt:

@Entity
@Table(name = "DEPARTMENT")
public class Department implements Serializable {

        .....

    private Set<Employee> employees = new HashSet<Employee>(0);

    // Mặc định @OrderBy("empNo") tương đương với @OrderBy("empNo asc").
    // Nó tạo ra câu SQL: Select ... from Employee ... order by EMP_NO desc

    @OrderBy("empNo desc")
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "department")
    public Set<Employee> getEmployees() {
        return employees;
    }
}

4.11- @Transient

Sehen Sie eine Situation
@Entity
@Table(name="Employee")
public class Employee implements Serializable {
 
      .....

      @Column(name="FIRST_NAME", nullable =false , length = 20 )
      public String getFirstName()  {
           return this.firstName;
      }

      @Column(name="LAST_NAME", nullable =false , length = 20)
      public String getLastName()  {
           return this.lastName;
      }

     public String getFullName()  {
          return this.firstName+ " "+ this.lastName;
     }
}
Sie möchten eine Methode  getFullName() schreiben. Die Methode ist nur eine Kalkulation, bezieht sich nicht einer Spalte unter DB. Deshalb sollen Sie @Transient benutzen um Ihre Absicht mit Hibernate zu informieren
@Transient
public String getFullName()  {
     return this.firstName+ " " + this.lastName;
}

@Transient
public boolean isManagerEmployee()  {
      return this.manager != null;
}

4.12- @Inheritance