1. 程式人生 > >【hibernate框架】幾種集合對映

【hibernate框架】幾種集合對映

1.Set
前面我們已經用過,就不再說。

2.List
Group.java:
package cn.edu.hpu.listMapping;


import java.util.ArrayList;
import java.util.List;


import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;


@Entity
@Table(name="m_group")
public class Group {
	private int id;
	private String name;
	private List<User> users=new ArrayList<User>();
	
	
	@OneToMany(mappedBy="group",
			cascade={CascadeType.ALL},
			fetch=FetchType.LAZY
		)
	public List<User> getUsers() {
		return users;
	}
	public void setUsers(List<User> users) {
		this.users = users;
	}
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
		
}

User.java:
package cn.edu.hpu.listMapping;


import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;


@Entity
@Table(name="m_user")
public class User {
	private int id;
	private String name;
	private Group group;
	
	//只要有雙向就要指定製定一個屬性(mapedby)
	//不指定的話會有兩個相同的欄位產生
    @ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
	public Group getGroup() {
		return group;
	}
	public void setGroup(Group group) {
		this.group = group;
	}
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

在hibernate.cfg.xml中配置:
<mapping class="cn.edu.hpu.listMapping.Group"/>
<mapping class="cn.edu.hpu.listMapping.User"/>


執行測試,輸出的sql語句:
alter table m_user 
        drop 
        foreign key FKBF71E05DA3D1B4E0


    drop table if exists m_group


    drop table if exists m_user


    create table m_group (
        id integer not null auto_increment,
        name varchar(255),
        primary key (id)
    )


    create table m_user (
        id integer not null auto_increment,
        name varchar(255),
        group_id integer,
        primary key (id)
    )


    alter table m_user 
        add index FKBF71E05DA3D1B4E0 (group_id), 
        add constraint FKBF71E05DA3D1B4E0 
        foreign key (group_id) 
        references m_group (id)


成功建立m_user與m_group表,並且在user裡建立了group的外來鍵關聯關係。
這時候,我們在group中取user資料的時候,要用list來取。

原則上來說,用set和list的區別不大,但是,當我們對取出的資料進行排序的時候,用list比較方便(set不支援排序)。

排序可以設定任意屬性進行排序,也可以使用聯合屬性進行排序。
這裡我們可以通過設定Annotation註解來設定:
@OrderBy
public List<User> getUsers() {
		return users;
	}
//@OrderBy預設按主鍵id排序
//@OrderBy("X DESC")/@OrderBy("X ASC")指按照X屬性的ASC(升序)或DESC(降序)排序

其實完全可以不這麼做,因為HQL語句就可以實現從資料庫取資料的時候進行orderBy排序了。

3.Map

User.java一樣,Group中的users變成Map形式。Map的Key值設定為主鍵(因為Key值不能重複),value設為User。
package cn.edu.hpu.listMapping;

import java.util.HashMap;
import java.util.Map;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MapKey;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;

@Entity
@Table(name="m_group")
public class Group {
	private int id;
	private String name;
        private Map<Integer,User> users=new HashMap<Integer,User>();
	
        @OneToMany(mappedBy="group")
	@MapKey
	public Map<Integer, User> getUsers() {
		return users;
	}
	public void setUsers(Map<Integer, User> users) {
		this.users = users;
	}
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
		
}
其中@MapKey(name="id")指定map的Key值是屬性的哪一個值。


建表語句:
 alter table m_user 
        drop 
        foreign key FKBF71E05DA3D1B4E0


    drop table if exists m_group


    drop table if exists m_user


    create table m_group (
        id integer not null auto_increment,
        name varchar(255),
        primary key (id)
    )


    create table m_user (
        id integer not null auto_increment,
        name varchar(255),
        group_id integer,
        primary key (id)
    )


    alter table m_user 
        add index FKBF71E05DA3D1B4E0 (group_id), 
        add constraint FKBF71E05DA3D1B4E0 
        foreign key (group_id) 
        references m_group (id)

這樣,當我們取users的時候,它會幫我們裝到map裡。

取出測試(group-g1裡面有u1、u2、u3三個user物件):

@Test
public void testMapGroup(){
	sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
	Session s=sessionFactory.openSession();
	s.beginTransaction();
	Group g=(Group)s.load(Group.class,1);
	for(Map.Entry<Integer, User> entry:g.getUsers().entrySet()){
		System.out.println(entry.getValue().getName());
	}
	s.getTransaction().commit();
}

輸出SQL語句和結果:
Hibernate: 
    select
        group0_.id as id0_0_,
        group0_.name as name0_0_ 
    from
        m_group group0_ 
    where
        group0_.id=?
Hibernate: 
    select
        users0_.group_id as group3_0_1_,
        users0_.id as id1_,
        users0_.id as formula0_1_,
        users0_.id as id1_0_,
        users0_.group_id as group3_1_0_,
        users0_.name as name1_0_ 
    from
        m_user users0_ 
    where
        users0_.group_id=?
u1
u2

u3

相關推薦

hibernate框架集合對映

1.Set 前面我們已經用過,就不再說。2.List Group.java:package cn.edu.hpu.listMapping; import java.util.ArrayList; import java.util.List; import javax

hibernate框架hibernate遇到的個異常解決

  今天使用hibernate3.6.5自己配置jar lib,在測試時遇到了幾個異常如下: 1.java.lang.NoSuchFieldError: INSTANCE       解決:刪除hibernate-annotations.jar。 2.java.lang.C

hibernate框架快取機制之二級快取

二級快取是sessionFactory級別的快取,可以跨越session存在。 hibernate文件裡關於二級快取的說明: 二級快取(The Second Level Cache) hibernate支援多種多樣的二級快取的實現,但hibernate本身並沒有寫二級快取的

SpringMVC框架註解的處理器對映器和介面卡配置

下面我們來探討註解的處理器對映器和介面卡 1.註解的處理器對映器和介面卡 在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping註解對映器。 在

hibernate框架使用hibernate實現悲觀鎖和樂觀鎖

四種隔離機制不要忘記:(1,2,4,8) 1.read-uncommitted:能夠去讀那些沒有提交的資料(允許髒讀的存在) 2.read-committed:不會出現髒讀,因為只有另一個事務提交才會讀取來 結果,但仍然會出現不可重複讀和幻讀現象。 4.repeatable

hibernate框架用Annotation註解表示id生成策略

這裡簡單說一下用Annotation如何設定ID的生成策略: 除了在XML檔案中去指定id的生成策略,還可以用Annotation中的註解去指定id的生成策略。 方法:@Id @GeneratedValue public int getId() { return

Hibernate框架學習Hibernate進階之詳解Hibernate配置檔案和物件關係對映配置檔案

       Hibernate核心配置檔案               我們先來看一個比較常見的hibernate.cfg.xml配置檔案: <!DOCTYPE hibernate-confi

持久化框架Mybatis與Hibernate的詳細對比

很大的 效率 myba 今天 http 目的 ping pin 增刪 作為一位優秀的程序員,只知道一種ORM框架是遠遠不夠的。在開發項目之前,架構的技術選型對於項目是否成功起到至關重要的作用。我們不僅要了解同類型框架的原理以及技術實現,還要深入的理解各自的優缺點,以便我們能

SSH框架Hibernate系列一

路徑 應用 port setname domain 配置文件 學習 縮進 object 微信公眾號:compassblog 歡迎關註、轉發,互相學習,共同進步! 有任何問題,請後臺留言聯系! 1、Hibernate框架概述 (1)、什麽是HibernateH

SSH框架系列之 Spring 整合 Hibernate 框架

操作 enter pda 就是 負責 spring配置 1.0 port -s 1、SSH 三大框架整合原理 Spring 與 Struts2 的整合就是將 Action 對象交給 Spring 容器來負責創建。 Spring 與 Hibernate 的整合就是將

選型DubboRPC的選型比較

https://blog.csdn.net/liyanlei5858/article/details/77924407?utm_source=blogxgwz3   一、Dubbo通訊協議       第一、dubbo

CVHierarchy of Transformation的區別

Projective Transformation: 原本平行的線在對映之後不平行。 Affine Transformation: 保持直線對映成直線,且原先平行的線對映後還是平行。Affine 就是H這個transformational matrix的最後一行為0 0 1. Si

python資料結構與演算法排序演算法:氣泡排序、快速排序

以下排序演算法,預設的排序結果是從小到大。 一.氣泡排序: 1.氣泡排序思想:越大的元素,就像越大的氣泡。最大的氣泡才能夠浮到最高的位置。 具體來說,即,氣泡排序有兩層迴圈,外層迴圈控制每一輪排序中操作元素的個數——氣泡排序每一輪都會找到遍歷到的元素的最大值,並把它放在最後,下一輪排序時

框架Springmvc非註解對映器和介面卡

非註解的介面卡 1、簡單的url處理器對映器 <!-- 簡單的url處理器對映器 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

小波閾值去噪程式

例1: load leleccum; index = 1:1024; x = leleccum(index); %產生噪聲訊號 init = 2055615866; randn('seed',init); nx = x + 18*randn(size(x)); %獲取消

SpringBoot定時任務的實現方式

SpringBoot 幾種定時任務的實現方式 Wan QingHua 架構之路  定時任務實現的幾種方式: Timer:這是java自帶的java.util.Timer類,這個類允許你排程一個java.util.TimerTask任務。使用這種方式可以讓你的程

C/C++開發的開源搜尋引擎

(1)CLucene CLucene是Lucene的一個C++埠,Lucene是一個基於java的高效能的全文搜尋引擎。CLucene因為使用C++編寫,所以理論上要比lucene快。 (2)Xapian Xapian是一個用C++編寫的全文檢索程式,他的作用類似於Java的lucene。儘管在Java世

Machine learning(python篇)-常用的資料結構

       python中有多種資料結構,資料結構之間也可以相互轉化,概念一多就容易使人混淆,對於初學者來說本來很容的概念,最終卻變成了噩夢,很難區分不同資料結構之間的用法,這樣就會造成亂用資料結構,致使執行效率低下。對於較簡單的程式來說亂用資料結構不會有太大的問題,但涉

SpringMVC框架非註解的處理器對映器和介面卡

非註解的處理器對映器和介面卡 1.非註解的處理器對映器 之前的處理器對映器: org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping<!-- 配置Handler --> <bea

面試必讀(程式設計基礎)常用的設計模式介紹

http://blog.csdn.net/xsl1990/article/details/16359289 每個設計模式詳細介紹請看 http://blog.jobbole.com/tag/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/