1. 程式人生 > >hibernate註解實現級聯新增

hibernate註解實現級聯新增

摘要:

如題,簡單記一下,ssh框架中,使用註解形式,怎麼級聯新增主外來鍵關聯表資料

一、前期準備:

1.建立工程,匯入ssh框架及資料來源的相關jar包;

2.建立和資料庫有關的properties檔案,該檔案中只有資料來源連線資料庫所需的相關資訊(資料來源再applicationContext.xml中配置)

3.建立applicationContext.xml檔案,該檔案中包含:

3.1.註解的使用前提配置

3.2.對資料來源相關資訊的properties檔案的載入

3.3.資料來源的配置

3.4.對sessionFactory的dataSource注入、方言等 以及 對@Entity的 註解所在的包的掃描

3.5.事物的配置

4.建立web.xml,如果是作為小demo的話,這裡可以只配置對structs的監聽 和 對applicationContext.xml的載入

5.建立相關mvc三層及structs.xml的配置等

6.其他

綜合網上其他資源的原因,我只記錄model實體類的相關程式碼和Action中的insert程式碼

二、實體類分為部門表和員工表,一個部門對應多個員工,且是雙向的關係

2.1.部門表(department)

其中@OneToMany註解中的mappedBy屬性是員工表(employee)中的類屬性

package com.entity;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

@Entity
@Table(name = "department")
public class Department {
	@Id
    @GeneratedValue(strategy= GenerationType.AUTO)
	private Integer id;
	@Column
	private String name;
	@Column
	private String monitor;
	
	@OneToMany(mappedBy = "department",cascade = {CascadeType.ALL})
	@LazyCollection(LazyCollectionOption.EXTRA)  //LazyCollection屬性設定成EXTRA指定了當如果查詢資料的個數時候,只會發出一條 count(*)的語句,提高效能
	private Set<Employee> employees = new HashSet<Employee>();

	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 getMonitor() {
		return monitor;
	}

	public void setMonitor(String monitor) {
		this.monitor = monitor;
	}

	public Set<Employee> getEmployees() {
		return employees;
	}

	public void setEmployees(Set<Employee> employees) {
		this.employees = employees;
	}

	
	
	
}

2.2.員工表(employee)

@JoinClomun註解中的屬性,是員工表裡管理部門表的外來鍵名稱

package com.entity;


import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "employee")
public class Employee {
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Integer id;
	@Column
	private String name;
	@Column
	private String email;
	
	@ManyToOne(targetEntity=Department.class)  
	@JoinColumn(name = "departmentNo")    //JoinColumn 的name屬性指定了外來鍵的名稱
	@Basic(fetch=FetchType.LAZY)
	private Department department;
	
	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 getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	public Department getDepartment() {
		return department;
	}
	public void setDepartment(Department department) {
		this.department = department;
	}
	public Employee(Integer id, String name, String email) {
		super();
		this.id = id;
		this.name = name;
		this.email = email;
	}
	public Employee() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	
}

2.3.所謂關聯表的兩個實體,說起來就是你中有我,我中有你。

一方表中(本例中為部門表)擁有多方的(員工表)的集合,因為一個一方對應多個多方;

反過來,多方表中(本例中為員工表)擁有一方表中(部門表)的一個實體,因為一個多方只能對應一個一方。

最後,還需要把兩張表給關聯起來,這個時候就需要註解來起關聯作用。

三、Action部分程式碼(insert方法)

public String insert(){
		
		//部門
		Department d = new Department();
		d.setName("行政管理部門");
		d.setMonitor("胡小菲");
		
		//員工1
		Employee e1 = new Employee();
		e1.setName("aa");
		e1.setEmail("[email protected]");
		e1.setDepartment(d);
		
		//員工2
		Employee e2 = new Employee();
		e2.setName("bb");
		e2.setEmail("[email protected]");
		e2.setDepartment(d);
		
		//關聯
		d.getEmployees().add(e1);
		d.getEmployees().add(e2);
		
		int flag = baseService.save(d);
		return "success";
	}

這樣就實現了關聯表的級聯插入.

相關推薦

hibernate註解實現新增

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

Hibernate新增

Hibernate:級聯新增 案例講解: 訂單和訂單項 1.1:訂單類: public class Order { private Integer orderId; private String orderNo; //定義一對多的關係時一定需要採用介

hibernate的關聯,一對多(新增查詢,普通刪除)

一、什麼是關聯(association) 1、關聯指的是類之間的引用關係。如果類A與類B關聯,那麼被引用的類B將被定義為類A的屬性。 2、關聯的分類:關聯可以分為一對一、一對多/多對一、多對多關聯 關聯是有方向的 關聯的關鍵點都在外來鍵上 二、如何建立一對多雙向

Hibernate 新增刪除

問題描述:實體類答案從屬於實體類問題。(一對多) /** * 新增 問題 和 選項 * @throws Exception */@Test

註解方式實現

級聯 級聯分為一對多,多對一單向,多對多雙向關聯。一般情況下,我們只會用到前兩種情況,多對多用的較少。我這裡使用省市區三級聯查來實現級聯的操作。簡單來說,一對多就是一個省下面有多個市,一個市下面有多個縣。多對一是剛好反過來的。 首先是使用配置檔案的情況下,關聯類,生成的h

Mysql實現操作(更新、刪除)

刪除表 null weight .cn eat 失敗 bsp src 成績 一、首先創建兩張表stu,sc create table stu( sid int UNSIGNED primary key auto_increment, name varchar(20) no

hibernate(六) cascade()和inverse關系詳解

是把 我們 概念 src 練習 需要 開始 解釋 關聯關系     序言         寫這篇文章之前,自己也查了很多的資料來搞清楚這兩者的關系和各自所做的事情,但是百度一搜,大多數博文感覺說的雲裏霧裏,可能博主自己清楚是怎麽一回事,但是給一個不懂的人或者一知半解的人看的

Spring Data Jpa 基於註解查詢

公司最近還是在使用spring data jpa,自己練習時遇到一些坑,記錄一下 首先描述一些業務邏輯: 一共有兩張表,一張學生表,一張公司表,學生與公司屬於一對多的關係,即一個學生只能屬於一個公司,但是一個公司可以擁有多名學生 學生實體類: package com.sj.Entit

MVC4中使用Html.DropDownList實現

準備工作 首先準備一下要級聯的資料,新建兩個類:Province和City public class Province { public string Id { get; set; } public string Name { get; set; }

Hibernate入門(八)刪除

Hibernate級聯刪除   上一篇文章學習了級聯儲存和更新,這個級聯刪除應該很好理解的。一樣的道理,刪除一方,同時刪除有關聯的一方。   同樣有方向性。   刪除客戶,客戶下的訂單也同樣刪除。   使用者表:      訂單表: 業務:刪除id值為1的客戶,想要的效果:同時刪除id值為1

MYSQL 新增外來鍵

MySQL支援外來鍵的儲存引擎只有InnoDB,在建立外來鍵的時候,要求父表必須有對應的索引,子表在建立外來鍵的時候也會自動建立對應的索引。在建立索引的時候,可以指定在刪除、更新父表時,對子表進行的相應操作,包括RESTRICT、NOACTION、SET NULL和CASCADE。其中RESTRICT和NO

一對多(新增查詢,刪除)

1. 什麼是關聯(association)   1.1 關聯指的是類之間的引用關係。如果類A與類B關聯,那麼被引用的類B將被定義為類A的屬性。例如:       public class A{         private B b = new B;         publ

hiberbate一對多的新增查詢與刪除

1. 什麼是關聯(association) 1.1 關聯指的是類之間的引用關係。如果類A與類B關聯,那麼被引用的類B將被定義為類A的屬性。例如: public class A{ private B b = new B; public A(){} } 1.2 關聯

AngularJs實現

//讀取模板id $scope.$watch('entity.goods.category3Id',function(newValue,oldValue){ itemCatService.findOne(newValue).success(function(response){ $sco

oracle 觸發器實現更新

create or replace TRIGGER 觸發器名字 AFTER UPDATE OF 更新表的更新列列名a1 ON 更新表表名a FOR EACH ROW BEGIN IF :OLD.更新表的更新列列名a1<>:NEW.更新表的更新列列名a1 THE

hibernate jpa manyToOne操作時,update時報出identifier of an instance of 問題的解決方案及update問題

   最近一直在用Jpa來做專案,jpa的優點這裡我就不多說了,說一下最近使用時解決的一個問題吧。 首先來說,使用jpa進行update操作時,由於呼叫的是jpa封裝好的save方法,所以如果表單頁面中沒有提到的引數,這時儲存的時候,沒有提到的引數就會被置為null,為此我

Hibernate ManytoMany 標註增刪改查完整操作

我們在使用者和角色的概念上經常要用到多對多關係本文綜合全部情況統一進行說明 實現了的操作: - 儲存新增User使用者的時候儲存新的Role - 新增User使用者繫結已有Role後儲存關係 - 刪除使用者時刪除跟角色的對應關係 - 只有角色沒有對應任何使用者的時候才能刪除

Ajax 實現下拉框

級聯下拉框隨處可見,最常見的就是省市的級聯,在選擇省份後,對應的區縣的下拉選擇列表的下拉選擇內容也會發生相應改變,即所謂的級聯下拉框。這種頁面非同步重新整理,無可厚非,AJax是首選。 在做一個管理系統時,有這樣一個需求,在選擇了倉庫後,對應的倉位下拉選擇框的內容也需要改變

Extjs下combox 實現

//**測試下拉框級聯** var storedm = new Ext.data.Store({ //隊名稱下拉框 proxy: new Ext.data.HttpProxy({ ur

支付寶賬戶等顯示*的實現學習TRANSLATE、RPAD/LPAD函式用法

平常在支付寶或者銀行賬戶等轉賬的時候系統為了保護隱私,一般將客戶的姓打成 * 號,直接看例子 SQL> --示例版,無法解決 倆字名字 如:肖真 或者帶有重複名字如:肖真真 SQL> SELECT TRANSLATE('王海波',SUBSTR('王海波',