您可以從此處下載工作示例。
在此示例中,我們僅考慮兩個實體。 復仇者聯盟和反派。 我們使用聯接表在兩者之間建立關系。 讓我們看一下此示例中使用的域映射。
package com.avengers.domain;import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;import javax.persistence.CascadeType;
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.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;import org.hibernate.annotations.Type;/*** The domain class representing each member of the avengers* * @author Dinuka.Arseculeratne* */
@Entity
@Table(name = "Avengers")
public class Avenger implements Serializable {/*** The primary key of the Avenger table*/@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "avenger_id")private Long avengerId;/*** The name of the avenger member*/@Column(name = "avenger_name")private String avengerName;/*** A flag which holds whether the avenger's powers are awesome*/@Type(type = "yes_no")@Column(name = "is_awesome")private boolean isAwesome;/*** The list of enemies the avenger has*/@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)@JoinTable(name = "AVENGERS_AND_VILLAINS", joinColumns = { @JoinColumn(name = "avenger_id") }, inverseJoinColumns = { @JoinColumn(name = "villain_id") })private List<Villain> enemyList = new ArrayList<Villain>();public Long getAvengerId() {return avengerId;}public void setAvengerId(Long avengerId) {this.avengerId = avengerId;}public String getAvengerName() {return avengerName;}public void setAvengerName(String avengerName) {this.avengerName = avengerName;}public boolean isAwesome() {return isAwesome;}public void setAwesome(boolean isAwesome) {this.isAwesome = isAwesome;}public List<Villain> getEnemyList() {return enemyList;}public void addEnemy(Villain enemy) {enemyList.add(enemy);}@Overridepublic String toString() {return "Avenger [avengerId=" + avengerId + ", avengerName="+ avengerName + ", isAwesome=" + isAwesome + ", enemyList="+ enemyList + "]";}}
此類映射一個復仇者。 為了使這個示例盡可能簡短,我使用了最少的字段。 惡棍域如下所示;
package com.avengers.domain;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;import org.hibernate.annotations.Type;/*** This class represents the Villain forces against the avengers* * @author Dinuka.Arseculeratne* */
@Entity
@Table(name = "Villains")
public class Villain implements Serializable {/*** The primary key of the Enemy table*/@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "villain_id")private Long villaiId;/*** The name of the enemy*/@Column(name = "villain_name")private String villainName;/*** A flag which checks whether the villain is super awesome*/@Type(type = "yes_no")@Column(name = "is_awesome")private boolean isAwesome;public Long getVillaidId() {return villaiId;}public void setVillaidId(Long villaidId) {this.villaiId = villaidId;}public String getVillainName() {return villainName;}public void setVillainName(String villainName) {this.villainName = villainName;}public boolean isAwesome() {return isAwesome;}public void setAwesome(boolean isAwesome) {this.isAwesome = isAwesome;}@Overridepublic String toString() {return "Villain [villaiId=" + villaiId + ", villainName=" + villainName+ ", isAwesome=" + isAwesome + "]";}}
好的,現在我們已經定義了域,讓我們看看DetachedCriteria是如何進行數據檢索的。 我在這里使用DetachedCriteria是因為復仇者聯盟非常具體,并表示他們不希望與Hibernate會話發生任何關系,因此,我使用了DetachedCriteria,它不需要存在休眠會話。
我們的主要目標是找回小人所屬的復仇者聯盟。 請注意,這假設同一個小人不能是多個超級英雄的小人。 因此,我繼續在下面給出根據傳遞的反派名稱檢索復仇者的方法。
public Avenger retrieveAvengerByVillainName(String villainName) {Avenger avenger = null;/*** Selected a detached criteria so we do not need a session to run it* within.*/DetachedCriteria criteria = DetachedCriteria.forClass(Avenger.class);/*** Here we are doing an inner join with the Villain table in order to do* a name comparison with the villainName passed in as a method* parameter*/DetachedCriteria villainCriteria = criteria.createCriteria("enemyList");villainCriteria.add(Restrictions.eq("villainName", villainName));villainCriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);@SuppressWarnings("unchecked")List<Avenger> avengerList = getHibernateTemplate().findByCriteria(criteria);if (!avengerList.isEmpty()) {avenger = avengerList.get(0);getHibernateTemplate().initialize(avenger.getEnemyList());}return avenger;}
在這種方法中,我們要做的是首先為主類創建一個條件,在本例中為Avenger.class 。 然后,我們需要與Villain表進行聯接,因此,我們將使用我們在Avenger域類中定義的列表名稱,從主要條件中創建一個子條件。
那么就需要使反派域名的屬性與傳入的反派名稱相等。
Criteria API的強大功能使您可以輕松創建動態查詢,如果我們要使用純HQL,這將很麻煩,而純HQL需要大量的字符串連接才能實現。
提供了一個名為AvengerTest.java的示例測試類,其附件位于最頂部。 請注意,您需要刪除avenger-context.xml上的注釋,以便創建此示例所需的表。
就是這樣。
復仇者聯盟現在可以避免冒險,因為他們擁有一個系統,可以將任何超級反派與聯盟中的超級英雄聯系起來。
一如既往地歡迎和贊賞您的意見和建議。
感謝您抽出寶貴的時間閱讀!!!!
參考:“ 通過示例進行休眠–第2部分(DetachedCriteria)”,來自我們的JCG合作伙伴 Dinuka Arseculeratne,在“ 我的旅程” IT博客中
- 通過示例休眠–第1部分(刪除孤兒)
- 休眠陷阱
- 休眠自動提交命令強制MySQL在過多的磁盤I / O中運行
- DataNucleus 3.0與Hibernate 3.5
- Hibernate映射集合性能問題
- Spring MVC3 Hibernate CRUD示例應用程序
- Java教程和Android教程列表
翻譯自: https://www.javacodegeeks.com/2011/11/hibernate-by-example-part-2.html