1. 程式人生 > >用hibernate+註解實現各種關係對映

用hibernate+註解實現各種關係對映

本文轉自:http://blog.csdn.net/bigtree_3721/article/details/42343639

基本環境準備

    我們先來看看一個具體的JPA工程示例。要執行這個示例,我們需要如下的類庫和軟體安裝配置好:

    類庫: EclipseLink, mysql-connector-j

    資料庫: Mysql

    開發環境:eclipse

    因為JPA是一個公開的規範,所以有不同的實現。我們需要一個JPA的類庫。這裡我們引用瞭如下類庫:EclipseLink  (可以讓eclipse 幫我們下載去)。

    在下載EclipseLink包後,解壓。我們需要將裡面jlib目錄下的eclipselink.jar以及jlib/jpa目錄裡的java.persistence.x.jar引入到工程中就可以。

後面我們定義程式碼裡的對映關係對應的底層實現就是由這兩個包實現。 既然要實現ORM,肯定少不了資料庫。這裡我們用了比較傳統的mysql資料庫。所以少不了也需要引用mysql的jdbc驅動:mysql-connector-javax.jar

    準備好了這些之後,我們建立一個JPAProject的java工程。整體的專案結構如下圖:

    這裡為了方便工程引用類庫,首先將這些庫檔案拷貝到工程下面的一個lib目錄裡,再將這些庫引入到工程中。

persistence.xml

    在前面配置好基本的類庫之後我們還有一個需要關心的就是,既然我們是ORM,就有一個要對映到資料庫的地方。這裡是怎麼對映到資料庫的呢?具體又對映到哪個資料庫呢?這些都是在persistence.xml檔案定義的。我們在建立好工程之後的src目錄裡建立一個META-INF的目錄,然後在這個目錄裡建立一個persistence.xml檔案。程式連線資料庫和物件對映的配置資訊就是通過讀取這個目錄下的檔案來實現的。我們來看一個persistence.xml的示例:

Xml程式碼  收藏程式碼
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence   
  4.     http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"  
  5.     version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
    >  
  6.     <persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL">  
  7.         <class>model.PersonInformation</class>  
  8.         <properties>  
  9.             <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />  
  10.             <property name="javax.persistence.jdbc.url"  
  11.                 value="jdbc:mysql://localhost:3306/simpleDb" />  
  12.             <property name="javax.persistence.jdbc.user" value="root" />  
  13.             <property name="javax.persistence.jdbc.password" value="root" />  
  14.             <!-- EclipseLink should create the database schema automatically -->  
  15.             <property name="eclipselink.ddl-generation" value="create-tables" />  
  16.             <property name="eclipselink.ddl-generation.output-mode"  
  17.                 value="database" />  
  18.         </properties>  
  19.     </persistence-unit>  
  20. </persistence>  

    這裡都是xml的配置項,看起來也很容易懂。在一個<persistence-unit>的單元裡定義了這個unit的名字以及詳細的資料庫連線驅動,資料庫使用者名稱,密碼。前面<class>裡面定義的是需要對映到資料庫的具體實體類。比如model.Employee就對應於我們在package model裡定義的Employee類。因為我們要連的資料庫是mysql,這裡的javax.persistence.jdbc.driver值被設為com.mysql.jdbc.Driver。而我們具體要連線的資料庫名字在javax.persistence.jdbc.url對應的值裡面定義了,為simpleDb。為了後面實際程式執行的時候能夠讀寫這個庫,我們需要事先在資料庫裡建立simpleDb。

    OK,有了這些基本的設定。我們就能連上資料庫進行實際的操作了。

實體物件定義

    現在,我們需要定義一個可以具體例項化到資料庫裡的物件。我們定義一個PersonInformation的類如下:

Java程式碼  收藏程式碼
  1. package model;  
  2. import javax.persistence.Entity;  
  3. import javax.persistence.Id;  
  4. @Entity  
  5. public class PersonInformation {  
  6.     @Id  
  7.     private int id;  
  8.     private String name;  
  9.     private int age;  
  10.     public int getId() {  
  11.         return id;  
  12.     }  
  13.     public void setId(int id) {  
  14.         this.id = id;  
  15.     }  
  16.     public String getName() {  
  17.         return name;  
  18.     }  
  19.     public void setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.     public int getAge() {  
  23.         return age;  
  24.     }  
  25.     public void setAge(int age) {  
  26.         this.age = age;  
  27.     }  
  28. }  

    這裡只是很簡單的一個entity bean物件定義。我們針對每個可以操作的物件定義了get, set方法。這裡比較有意思的地方是我們用了兩個annotation,一個是@Entity,一個是@Id。這裡的@Entity表示一個可以序列化對映的的物件。如果我們希望這個物件被對映到資料庫中的某個表,則必須要加上這個annotation。而@Id則表示對應表的主鍵。我們建一個表要求有對應的主鍵。這裡指定id為主鍵。如果我們不指定主鍵的話則執行的時候會出錯。有興趣的可以嘗試一下。

    有了這些定義之後,我們就可以來使用他們了。這裡是通過他們訪問資料庫的程式碼:

Java程式碼  收藏程式碼
  1. package main;  
  2. import javax.persistence.EntityManager;  
  3. import javax.persistence.EntityManagerFactory;  
  4. import javax.persistence.Persistence;  
  5. import model.PersonInformation;  
  6. public class Main {  
  7.     private static final String PERSISTENCE_UNIT_NAME = "EmployeeService";  
  8.     private static EntityManagerFactory factory;  
  9.     public static void main(String[] args) {  
  10.         factory = Persistence.createEntityManagerFactory(  
  11.                 PERSISTENCE_UNIT_NAME);  
  12.         EntityManager em = factory.createEntityManager();  
  13.         em.getTransaction().begin();  
  14.         PersonInformation person = new PersonInformation();  
  15.         person.setId(1);  
  16.         person.setAge(30);  
  17.         person.setName("fred");  
  18.         em.persist(person);  
  19.         em.getTransaction().commit();  
  20.         em.close();  
  21.     }  
  22. }  

    第一個需要建立的物件是EntityManagerFactory, 這裡通過Persistence.createEntityManagerFactory方法。而這個"EmployeeService"是哪裡來的呢?我們看前面的persistence.xml檔案,那裡有<persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL">這個定義。EmployeeService就是對應到這裡一個persistence-unit的名字。他們必須一致。實際上,如果我們需要訪問多個庫的話,在配置檔案裡也可以定義多個persistence-unit。有了這個factory之後我們再建立一個EntityManager物件。

    為了使得物件的建立成為一個事務來提交,我們通過em.getTransaction().begin(); em.getTransaction().commit();這兩個方法來完成整個資料插入的過程。

    現在執行程式,我們再去檢視資料庫的話,則會發現如下的資訊:

    回顧一下我們前面定義的PersonInformation物件的資訊,我們定義的欄位都是小寫格式的。對映到資料庫裡包括表名和表裡面欄位名都是大寫格式的。前面我們指定了id欄位為主鍵之後,對應的表裡這個欄位就有了primary key not null的限制。

修改

    從前面的執行結果,我們可以看到一些實體物件和資料庫表之間的對映關係。可是在實際情況中,有時候我們希望資料庫表名或者裡面的欄位名能夠更加可以定製化一點。不是簡單的將物件裡的欄位變成大寫的。這樣可以增加一點可讀性,那我們該怎麼修改呢?

    很顯然,我們需要指定物件應該對應哪個表名以及每個屬性應該對應什麼名字。這是修改後的程式碼:

Java程式碼  收藏程式碼
  1. 相關推薦

    hibernate+註解實現各種關係對映

    本文轉自:http://blog.csdn.net/bigtree_3721/article/details/42343639 基本環境準備     我們先來看看一個具體的JPA工程示例。要執行這個示例,我們需要如下的類庫和軟體安裝配置好:    

    Hibernate中使用JPA(註解)配置物件關係對映

    java中註解也是一大特點,平時進行單元測試時我們用過@Test註解進行測試 JPA就是java專門針對持久層框架進行設計的一套規範 JPA:Java Persistence API,其實它也就是一堆介面,就想JDBC一樣,不同的框架只要遵循這同一套規範就可以在java環境

    使用python 元類實現ORM關係對映

    元類實現ORM 1. ORM是什麼 ORM 是 python程式語言後端web框架 Django的核心思想,“Object Relational Mapping”,即物件-關係對映,簡稱ORM。 一個句話理解就是:建立一個例項物件,用建立它的類名當做資料表名,用建立它的類屬性對應資料表的

    springMVC實體表單上傳圖片+後臺hibernate註解管理的bean

    直接上程式碼:1,前臺的jsp: 後臺程式碼: 主要就是我的資料庫的crud是利用的hibrenate的基於bean的查詢,這樣一整,前臺顯示的時候顯示不出來,就是因為MulitPart這個型別,photo的MulitpartFile型別不知道對於

    hibernate註解實現級聯新增

    摘要:如題,簡單記一下,ssh框架中,使用註解形式,怎麼級聯新增主外來鍵關聯表資料一、前期準備:1.建立工程,匯入ssh框架及資料來源的相關jar包;2.建立和資料庫有關的properties檔案,該檔

    java程式碼實現各種經典排序演算法

    1、交換類排序:氣泡排序 ,時間複雜度O(n2,n的2次方),穩定型排序。 package SoreAlgorithm; public class SortAlgorithm { public static void main(String args[]) { in

    Hibernate註解實現一對一關聯

    本文使用Husband與Wife實現Hibernate的一對一關聯。使用的資料庫為SQL server 2005。 程式碼如下: Husband.java /** * */ package co

    Hibernate註解實現單表遞迴樹形結構

    目錄: 概述環境程式碼示例測試結果[一]、概述 在系統中,經常會用到無限級遞迴的樹形結構,比如選單、組織機構管理、多級分類等等,一般是在同一個表中定義父子關係實現這種樹形結構,本文主要講述如何運用hibernate全註解的方式實現這個功能。 [二]、環境 hibernate

    java註解實現ssh的一個完整例子

    在一個稍大的專案中,通常會有上百個元件,如果這些元件採用xml的bean定義來配置,顯然會增加配置檔案的體積,查詢以及維護起來也不太方便。個人也不喜歡配置那麼多的xml檔案。下面我們就利用java的註解實現ssh框架,註解相當於一種標記加了註解就等於打上了某種標記,沒

    hibernate註解實現一對一雙向外來鍵關聯

    一對一雙向外來鍵關聯1、主控方的配置同一對一單向一樣不用更改2、在被控方設定關聯物件的屬性引用上加上@OneToOne主鍵3、雙向關聯,必須要有mappedBy屬性(mappedBy的意思是由對方主導關聯關係)注意:自動生成表時會在兩張表上都加入外來鍵關聯關係,可以通過沒置m

    hibernate註解的方式控制要插入到資料庫中的日期的格式

    在資料庫中想要的日期的格式類似於:2014-01-01 15:10:10 實現步驟 一:建表的時候把日期欄位的型別設定為date 二:在實體類中新增hibernate註解:@Temporal(TemporalType.TIMESTAMP) @Temporal使用說明 1)只

    多媒體開發(6):濾鏡實現各種圖片效果

    之前講過使用FFmpeg的drawtext濾鏡(把圖片或文字加到視訊上),而實際上,FFmpeg的濾鏡很強大,遠不止加字幕或加圖片的功能。濾鏡很有趣,可以把圖片變模糊、變色、縮放旋轉,等等。 **本文介紹FFmpeg濾鏡的使用。目的是讓你感受一下FFmepg的濾鏡效果,這樣在實際需要某種效果時,可以考慮使用

    Hibernate各種基本註解及一對一(多)關係對映採坑筆記

    hibernate提供兩種方式配置關係對映,一種XMl配置,一種註解。SpringBoot已經自帶了hibernate註解方式,我也是特別喜歡使用註解,特此記下常用的知識點。

    Hibernate使用註解實現1VN的關係

    示例:國家、省份、城市的三級連動。 一、資料庫要求: 1、國家表nation:nid國家編號、nname國家名稱 2、省份表province:pid省份編號、pname省份名稱、nid國家的編號 3、城市表city:cid城市編號、cname城市名稱、pid省份編號 二、實體類:

    hibernate物件關係對映-註解

    1.OneToOne關係對映 OneToOne即一對一對映,簡單來說就是一個主表student和一個從表stucreditcard,B表中存在一個外來鍵關聯到student表,這種關聯關係既可以以外來鍵的方式建立也可以是人工維護的關聯關係。 單向一對一關聯(不包括主鍵關聯

    [Hibernate]註解/關係對映以及關係測試用例

    基本註解package OneToOneSingle; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; impor

    hibernate 中比 SimplePropertyPreFilter 還要好的過濾類 ComplexPropertyPreFilter(級聯過濾,關係對映過濾類,複雜的屬性預過濾器)!!!!

    在hibernate 中比 SimplePropertyPreFilter 還要好用的過濾類 比官方自帶的過濾類(SimplePropertyPreFilter )還好用,那肯定是自定義的啦! 先講下結果吧,看是不是諸位要的: 能過濾

    一起寫框架-Ioc內核容器的實現-對象的調-@Bean註解註入容器的對象(十二)

    擴展 lac iter component cts block 根據 spa urn 實現功能 現實需求中,有一些類似無法加入掃描組件註解的。如jdk裏面的類。 那麽框架必須要支持將沒有組件註解標識的類也可以有一個方式註入到容器裏面。 那麽,我們通過類似Spring的@

    Hibernate - 繼承關聯關係對映

    對於面向物件的程式設計語言而言,繼承和多型是兩個最基本的概念。Hibernate 的繼承對映可以理解持久化類之間的繼承關係。例如:人和學生之間的關係。學生繼承了人,可以認為學生是一個特殊的人,如果對人進行查詢,學生的例項也將被得到。 Hibernate支援三種繼承對映策略:

    註解實現ssh的例子

    在一個稍大的專案中,通常會有上百個元件,如果這些元件採用xml的bean定義來配置,顯然會增加配置檔案的體積,查詢以及維護起來也不太方便。個人也不喜歡配置那麼多的xml檔案。下面我們就利用java的註解實現ssh框架,註解相當於一種標記加了註解就等於打上了某種標記,沒