Hibernate框架整合JPA註解基礎事件
1.JPA註解
Entity
@javax.persistence.Entity(name=”xxx”)
name指定實體Bean的名稱,默認值爲 bean class 的非限定類名,select o from xxx o where o.id=?1
Table
@javax.persistence.Table(catalog=”xx”,name=”xx”,schema=”xx”,uniqueConstraints={UniqueConstraint(columnNames={“xx”,”xx”})})
name:指定表的名稱
catalog:指定數據庫名稱
schema:指定數據庫的用戶名
uniqueConstraints:指定唯一性字段約束,如爲personid 和name 字段指定唯一性約束
uniqueConstraints={ @UniqueConstraint(columnNames={“personid”, “name”})}
@Table標記表示所映射表的屬性,該註釋的屬性定義如下:
@Target({TYPE})
@Retention(RUNTIME)
public @interface Table {
String name() default "";
String catalog() default "";
String schema() default "";
UniqueConstraint[] uniqueConstraints() default {};
}
在使用此@Table標記時,需要注意以下幾個問題。
此標記需要標註在類名前,不能標註在方法或屬性前。
name屬性表示實體所對應表的名稱,默認表名爲實體的名稱。
catalog和schema屬性表示實體指定的目錄名或是數據庫名,這根據不同的數據庫類型有所不同。
uniqueConstraints屬性表示該實體所關聯的唯一約束條件,一個實體可以有多個唯一約束條件,默認沒有約束條件。
若使用uniqueConstraints標記時,需要配合標記UniqueConstraint標記來使用。
Id
@javax.persistence.Id()
映射到數據庫表的主鍵的屬性,一個實體只能有一個屬性被映射爲主鍵.
GeneratedValue
@javax.persistence.GeneratedValue(generator=”xxx”,strategy=GenerationType.AUTO)
strategy:表示主鍵生成策略,有AUTO,INDENTITY,SEQUENCE 和 TABLE 4種
分別表示讓ORM框架自動選擇,根據數據庫的Identity字段生成,根據數據庫表的Sequence字段生成,以有根據一個額外的表生成主鍵,默認爲AUTO
generator:表示主鍵生成器的名稱,這個屬性通常和ORM框架相關,例如,Hibernate可以指定uuid等主鍵生成方式.
例程:使用UUID作爲數據庫的主鍵類型
Hibernate UUID
@Id
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid",strategy = "uuid")
- Basic
@javax.persistence.Basic(fetch=FetchType.LAZY,optional=true)
fetch:抓取策略,延時加載與立即加載
optional:指定在生成數據庫結構時字段是否允許爲 null
- Column
@javax.persistence.Column(length=15,nullable=false,columnDefinition=”“,insertable=true,scale=10,table=”“,updatable=true)
name:字段的名稱,默認與屬性名稱一致
nullable:是否允許爲null,默認爲true
unique:是否唯一,默認爲false
length:字段的長度,僅對String類型的字段有效
columnDefinition:表示該字段在數據庫中的實際類型
通常ORM框架可以根據屬性類型自動判斷數據庫中字段的類型,
但是對於Date類型仍無法確定數據庫中字段類型究竟是DATE,TIME還是TIMESTAMP,
此外,String的默認映射類型爲VARCHAR,如果要將String類型映射到特定數據庫的BLOB或TEXT字段類型,該屬性非常有用
如: @Column(name="BIRTH",nullable="false",columnDefinition="DATE")
insertable:默認情況下,JPA持續性提供程序假設所有列始終包含在 SQL INSERT 語句中。
如果該列不應包含在這些語句中,請將 insertable 設置爲 false
updatable:列始終包含在 SQL UPDATE 語句中。如果該列不應包含在這些語句中,請將 updatable 設置爲 false
table:實體的所有持久字段都存儲到一個其名稱爲實體名稱的數據庫表中,如果該列與 @SecondaryTable
表關聯
需將 name 設置爲相應輔助表名稱的String名稱
Temporal
@javax.persistence.Temporal(TemporalType.DATE)
value:TemporalType.DATE,TemporalType.TIME,TemporalType.TIMESTAMP時間類型格式
Enumerated
@javax.persistence.Enumerated(EnumType.STRING)
value:EnumType.STRING,EnumType.ORDINAL
枚舉類型成員屬性映射,EnumType.STRING指定屬性映射爲字符串,EnumType.ORDINAL指定屬性映射爲數據序Lob
@javax.persistence.Lob
用於標註字段類型爲Clob和Blob類型
Clob(Character Large Ojects)類型是長字符串類型,實體的類型可爲char[]、Character[]、或者String類型
Blob(Binary Large Objects)類型是字節類型,實體的類型可爲byte[]、Byte[]、或者實現了Serializable接口的類。
通常使用惰性加載的方式,@Basic(fetch=FetchType.LAZY)
Transient
@javax.persistence.Transient
@Transient表示該屬性並非一個到數據庫表的字段的映射,ORM框架將忽略該屬性
SecondaryTable
@javax.persistence.SecondaryTable
將一個實體映射到多個數據庫表中
如:
@Entity
@SecondaryTables({ @SecondaryTable(name = "Address"), @SecondaryTable(name = "Comments") })
public class Forum implements Serializable {
@Column(table = "Address", length = 100)
private String street;
@Column(table = "Address", nullable = false)
private String city;
@Column(table = "Address")
private String conutry;
@Column(table = "Comments")
private String title;
@Column(table = "Comments")
private String Comments;
@Column(table = "Comments")
}
table屬性的值指定字段存儲的表名稱, 沒有用 @Column 註解改變屬性默認的字段將會存在於 Forum 表
- @Embeddable
@javax.persistence.Embeddable
嵌套映射,在被嵌套的類中使用Embeddable註解,說明這個就是一個可被嵌套的類,使用@Embedded
當同一個類被不同的註解方式的類嵌套時,可能會出現一些錯誤,使用@Access(AccessType. FIELD)
設定被嵌套類的註解方式映射到數據庫表的主鍵的屬性,一個實體只能有一個屬性被映射爲主鍵.
@javax.persistence.Id()
2. 創建Java Project
創建一個Java Project,引入Hibernate框架的相關jar包、mysql-connector的包,還有JUnit的相關jar包,目錄結構如下:
3. 創建數據庫
創建一個數據庫jpadb,用於本次JPA與Hibernate的整合的測試
create database `jpadb`;
無需創建相關表,Hibernate會幫助我們創建對應的表
4. 創建POJO類
需要創建一個POJO類,對其對應的私有變量加上相關的JPA註解
import java.io.Serializable;
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 = "student")
public class Student implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Integer id;
@Column(name = "name",length = 30)
private String name;
@Column(name = "password",length = 16)
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", password="
+ password + "]";
}
}
5. hiberante.cfg.xml配置
<?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">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<!--數據庫連接相關變量-->
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/jpadb</property>
<property name="connection.username">root</property>
<property name="connection.password">shouhu1314</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!--配置數據庫方言-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!--控制檯顯示執行的SQL語句-->
<property name="show_sql">true</property>
<!--自動更新數據庫表結構-->
<property name="hbm2ddl.auto">update</property>
<!--配置映射,由於使用JPA註解,故不必在加入對應的hbm.xml文件的ref-->
<mapping class="com.ljn.pojo.Student"/>
</session-factory>
</hibernate-configuration>
6. JUnit測試
創建一個JUnit Case,編寫代碼測試
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import com.pojo.Student;
public class StudentTest {
@SuppressWarnings("deprecation")
@Test
public void test() {
Configuration configuration = new AnnotationConfiguration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = null;
Transaction transaction = null;
try {
session = sessionFactory.openSession();
transaction = session.beginTransaction();
//創建一個Student實例,並設置屬性
Student student = new Student();
student.setName("Jimmy");
student.setGrade(99.5);
//在持久層保存Student實例
session.save(student);
//提交事務,將數據保存到數據庫
transaction.commit();
} catch (Exception ex) {
ex.printStackTrace();
transaction.rollback();
} finally {
if (session != null && session.isOpen()) {
session.close();
}
sessionFactory.close();
}
}
}
7. 測試結果
數據庫自動完成了創建student表,併成功插入了一條記錄