十三滴水:Hibernate(四)之Hibernate註解學習
如上是我們這篇部落格要學的東西···嗝血···現在是北京時間0:16
之前三篇的部落格的單表對映寫的都是基於xml的配置方式,使用註解的目的就是為了簡化繁瑣的orm對映檔案也就是.hbm的配置,註解做的事情就是我們ORM檔案要做的一切的事情,只是在形式上有所區別
接下來我們來了解一下jpa與hibernate之間的關係
那麼什麼是JPA呢?JPA的全稱是JavaPersistenceAPI,是我們java持久化的一個介面,JPA註解是屬於JavaEE的規範和標準;
JPA與Hibernate之間的關係可以理解為,JPA是一種標準的介面,hibernate是他的一種實現,但他的功能又是jpa的一種超集。
那麼hibernate是如何實現與JPA的關係的呢?
主要是通過三個元件來實現的:
1.hibernate-annotation元件
2.hibernate-entitymanager元件
3.hibernate-core元件
一般在程式開發過程當中,我們優先選擇JPA註解,這樣更有利於程式的移植和擴充套件。
接下來要學習的是hibernate的註解的分類:
1.類級別的註解
@Entity:表示的是一個實體類,對應我們資料庫當中的一張表,使用Entity時必須要指定我們實體類的主鍵屬性(保證我們表裡面不出現重複的記錄)
@Table:註釋指定了Entity所要對映的資料庫表,其中@Table.name()用來指定對映表的表名。如果預設@Table註釋,系統預設採用類名作為對映表的表名。
@Embeddable:是註釋Java類的,表示類是嵌入類。通過此註釋可以在你的Entity中使用一般的java物件,此物件需要用@Embeddable標註
2.屬性級別的註解
3.對映關係註解
在進行深入學習類級別的註解之前我們要先回顧一下hibernate配置檔案裡面的常用配置:
1.@Entity註解的學習:
新建一個專案,新建學生類:
package com.entity;
import java.util.Date;
import javax.persistence.Entity;/*JPA註解*/
import javax.persistence.Id;
//學生實體類 有了這個註解就可以保證我們的實體類將來會對映成資料庫當中的一張表
@Entity
public class Students {
private int sid;//學號
private String sname;//學生的姓名
private String gender;//學生的性別
private Date birthday;//學生的生日
private String major;//學生的專業
private String address;//地址
public Students(){
}
public Students(int sid, String sname, String gender, Date birthday,
String major, String address) {
//super();
this.sid = sid;
this.sname = sname;
this .gender = gender;
this.birthday = birthday;
this.major = major;
this.address = address;
}
@Id
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
並且建立一個測試類:
package com.entity;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;
public class testStudents {
@Test
public void testSchemaExport(){
//建立hibernate配置物件
Configuration config = new Configuration().configure();
//建立服務註冊物件
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//生成sessionFactory
SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
SchemaExport export = new SchemaExport(config);
}
}
接下來去配置我們的cfg配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.username">root</property>
<property name="connection.password">ciBOPO</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate_zhangxin?useUnicode=true&characterEncoding=UTF-8</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<mapping class="com.entity.Students"/>
</session-factory>
</hibernate-configuration>
執行我們的測試類:
成功建立了一張表:
正常的情況下我們是不需要去設定表名的 建立的表名預設的 就是我們實體類的名字
但是也有的時候要求建立的表名和我們的實體類的名字不同 這個時候我們可以通過設定entity 來改變我們的表名:@Entity(name="t_students")
:
就OK了
[email protected]註解的學習
@Table(name=“”,catalog=“”,schema=“”),與entity配合使用 表示實體類的資料庫表的資訊
name,可選,表名,預設和實體類名一致,只有在不一致的時候才要求指定表名;
catalog,可選,表示的是目錄的意思,預設為空
schema,可選,表示的是一個模式,預設為空
接下來我們來比較一下schema與catalog之間的區別:
一般的情況下來說,一個數據庫可以包含多個catalog,也就是多個目錄,那麼每一個catalog又可以包含多個schema,也就是模式,而每個schema又可以包含多個數據庫物件,這樣可以解決我們的資料庫命名衝突問題,但是從實際的角度來看,不同的資料庫對catalog和schema的支援方式是千差萬別的:
接下來我們用程式碼去驗證一下它;
在Students實體類前面我們去加上兩行註釋並匯入相應的包:
@Entity
@Table(name=”t_students”,schema=”hibernate_zhangxin”)
測試結果:
成功了
[email protected]註解
它不是一個entity類,也就是說他標註的實體類不會對映成一張表,但是這個類可以嵌入到另外一個實體類當中作為屬性而存在
下面我們在我們的程式碼中實際操作一下:
首先我們建立一個Address類:
package com.entity;
import javax.persistence.Embeddable;
//地址類嵌入類
@Embeddable//表示 的是嵌入類,這個類的物件在另外一個實體類當中充當屬性
public class Address {
private String postCode;//郵編
private String address;//具體的地址
private String phone;//電話
public Address(){
}
public String getPostCode() {
return postCode;
}
public void setPostCode(String postCode) {
this.postCode = postCode;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
接下來我們在students實體類當中註釋掉原有的 address,把address重寫定義成我們的嵌入類的型別:
package com.entity;
import java.util.Date;
import javax.persistence.Entity;/*JPA註解*/
import javax.persistence.Id;
import javax.persistence.Table;
//學生實體類 有了這個註解就可以保證我們的實體類將來會對映成資料庫當中的一張表
//@Entity(name="t_students")
@Entity
@Table(name="t_students",schema="hibernate_zhangxin")
public class Students {
private int sid;//學號
private String sname;//學生的姓名
private String gender;//學生的性別
private Date birthday;//學生的生日
private String major;//學生的專業
//private String address;//地址
private Address add;//地址
public Students(){
}
public Students(int sid, String sname, String gender, Date birthday,
String major,Address add) {
//super();
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.birthday = birthday;
this.major = major;
//this.address = address;
this.add=add;
}
@Id
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
// public String getAddress() {
// return address;
// }
// public void setAddress(String address) {
// this.address = address;
// }
public Address getAdd() {
return add;
}
public void setAdd(Address add) {
this.add = add;
}
}
也就是說我們用Embeddable註解的類並不是實體類,而是作為實體類中的一個屬性而存在,執行我們的測試類結果如下:
新建立的三個屬性address phone和postcode都存在了。
相關推薦
十三滴水:Hibernate(四)之Hibernate註解學習
如上是我們這篇部落格要學的東西···嗝血···現在是北京時間0:16 之前三篇的部落格的單表對映寫的都是基於xml的配置方式,使用註解的目的就是為了簡化繁瑣的orm對映檔案也就是.hbm的配置,註解做的事情就是我們ORM檔案要做的一切的事情,只是在形式上有
十五滴水:Hibernate(六)之Hibernate關聯對映註解
如上是我們本篇部落格裡要一起學習的內容 在學習具體的關係對映註解之前呢,我們先來回顧一下資料庫當中實體與實體之間究竟有哪些對映關係: 實體與實體之間的對映關係大體分為三種情況: 1.一對一:一個公民對應一個身份證號碼,反過來也是成立的; 2.一對多(
Java程式設計師從笨鳥到菜鳥之(五十三)細談Hibernate(四)Hibernate常用配置檔案詳解
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Java設計模式(四)之建立型模式:建造者模式
一、定義: 建造者模式將一個複雜物件的構建與表示分離,使得同樣的構建過程可以建立不同的表示。 建造者模式的UML結構圖: 建造者模式主要包含四個角色: Builder:抽象建造者。它宣告為建立一
Hibernate(四):Hibernate的初始化,增刪改查等方法
1,Hibernate初始化類 package com.hibernate; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Sessi
演算法工程師修仙之路:TensorFlow(四)
TensorFlow 入門 TensorFlow實現神經網路 TensorFlow 遊樂場及神經網路簡介 TensorFlow 遊樂場是一個通過網頁瀏覽器就可以訓練的簡單神經網路並實現了視覺化訓練過程的工具。 TensorFlow 遊樂場介面
mysql基礎(四)之索引
name 根據 正是 而不是 方案 加速 .com mtab 技術 索引簡介: 1、普通索引 普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對數據的訪問速度。因此,應該只為那些最經常出現在查詢條件 (WHEREcolumn=)或排序條件
一口一口吃掉Hibernate(四)——多對一單向關聯映射
mark frame 自動 exce itl format 表之間 cfg.xml pda hibernate對於數據庫的操作,全部利用面向對象的思維來理解和實現的。一般的單獨表的映射,相信大家都沒有問題,但是對於一些表之間的特殊關系,Hibernate提供了一些獨特的方式
Andrew Ng機器學習課程筆記(四)之神經網絡
sca 優化 介紹 www 之間 output 現在 利用 href Andrew Ng機器學習課程筆記(四)之神經網絡 版權聲明:本文為博主原創文章,轉載請指明轉載地址 http://www.cnblogs.com/fydeblog/p/7365730.html 前言
Shell入門(四)之數組
定義 col 元素 array 多維 開始 code logs shel 一、一維數組 bash支持一維數組(不支持多維數組),並且沒有限定數組的大小。 類似與C語言,數組元素的下標由0開始編號。 二、定義數組 在Shell中,用括號來表示數組,數組元素用"空格
MySQL集群(四)之keepalived實現mysql雙主高可用
健康檢查 重連 lose 搶占 pro 資源 交換機 state nec 前面大家介紹了主從、主主復制以及他們的中間件mysql-proxy的使用,這一篇給大家介紹的是keepalived的搭建與使用! 一、keepalived簡介 1.1、keepalived介紹
linux壓縮命令(四)之zip總結
zip linux zip unzip linux壓縮 zip支持目錄壓縮zip 2.zip 2.txt壓縮文件,支持重命名,源文件不消失zip -r test.zip ? ../d6z/壓縮目錄,壓縮後源文件不消失unzip 11.zip -d ./1/解壓縮都指定目錄,源文件不消失,自動生
SpringBoot(四)之thymeleaf的使用
運算 過程 plus boot 面向 fault 增加 opera rop 這篇文章將更加全面詳細的介紹thymeleaf的使用。thymeleaf 是新一代的模板引擎,在spring4.0中推薦使用thymeleaf來做前端模版引擎。 thymeleaf介紹 簡單
編碼原理詳解(四)---之字形掃描
便是 集中 img 詳解 工作 -- 漢字 如何 編碼原理 上一篇我們講到,經過量化後得到了諸多零值和整數值,本篇接下來講講編碼過程中過對這些值如何組織和處理,那就是ZigZag掃描嘍。 一、簡介 ZigZag掃描也稱作之字形掃描,何以得此稱謂,是因為其掃描的路徑特
Python入門篇(四)之字符串、字典、集合
Python 字典 1、字符串操作 字符串是無法修改的,只能作為查詢.在python中,加了引號的字符就是字符串類型,python並沒有字符類型。定義:name=‘kim‘ #name=str(‘kim‘) 用於標識:描述性的內容,如姓名,性別,國籍,種族那單引號、雙引號、多引號有什麽區別呢? 讓我
ESP32學習筆記(四)之I2C總線
oid 操作系統 parameter ica basis condition 技術分享 col rto 上一篇帖子我們了解了一下ESP32運行多任務的操作以及現象,其實也就是一個實時操作系統。那麽,這篇帖子我們就結合“LM75a”溫度傳感器來學習一下ESP32的IIC總線吧
C++標準庫(四)之String
條件 val first operator ins iter substr() oid tof String 常見操作 bool empty() const size_type size() const size_type length() const size_type
Java 多線程(四)之守護線程(Daemon)
機會 兩種 如何 產生 tex begin 就會 set final 定義 Java 中有兩種線程: 一種是用戶線程(User Thread),一種是守護線程(Daemon Thread)。 守護線程是一種特殊的線程, 它的特殊有“陪伴”的含義, 當線程中不存在非守護線程時
spring-boot-2.0.3不一樣系列之源碼篇 - run方法(四)之prepareContext,絕對有值得你看的地方
release led 設置 get handler htm encoding 列表創建 splay 前言 此系列是針對springboot的啟動,旨在於和大家一起來看看springboot啟動的過程中到底做了一些什麽事。如果大家對springboot的源碼有所研究,可
mybatis源碼-解析配置文件(四)之配置文件Mapper解析
als cif fragments etc add contex csdn chm element 在 mybatis源碼-解析配置文件(三)之配置文件Configuration解析 中, 講解了 Configuration 是如何解析的。 其中, mappers作為con