Hibernate關(guān)聯(lián)關(guān)系可分為單向關(guān)聯(lián)和雙向關(guān)聯(lián)兩大類。單向關(guān)聯(lián)可以分為一對一、一對多、多對一和多對多4種關(guān)聯(lián)方式,而多向關(guān)聯(lián)可以分為一對一、一對多和多對多3種關(guān)聯(lián)方式。 Hibernate連接管理類HibernateUtil.java public class HibernateUtil { private st
Hibernate關(guān)聯(lián)關(guān)系可分為單向關(guān)聯(lián)和雙向關(guān)聯(lián)兩大類。單向關(guān)聯(lián)可以分為一對一、一對多、多對一和多對多4種關(guān)聯(lián)方式,而多向關(guān)聯(lián)可以分為一對一、一對多和多對多3種關(guān)聯(lián)方式。
Hibernate連接管理類HibernateUtil.java
public class HibernateUtil {
private static SessionFactory sessionFactory;
private static final ThreadLocal threadLocal = new ThreadLocal();
static{
try{
Configuration cfg = new Configuration().configure();
sessionFactory = cfg.buildSessionFactory();
}catch(Throwable ex){
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
public static Session getSession() throws HibernateException{
Session session = (Session)threadLocal.get();
if(session == null || !session.isOpen()){
session = (sessionFactory != null)?sessionFactory.openSession():null;
threadLocal.set(session);
}
return session;
}
public static void closeSession() throws HibernateException{
Session session = (Session)threadLocal.get();
threadLocal.set(null);
if(session != null){
session.close();
}
}
public static void shutdown(){
getSessionFactory().close();
}
}
1.單向的一對一關(guān)聯(lián)
(1)通過主鍵關(guān)聯(lián)
通過主鍵關(guān)聯(lián),是指兩個數(shù)據(jù)表之間通過主鍵建立一對一的關(guān)聯(lián)關(guān)系。這兩張表的主鍵值是相同的,一張表改動時,另一張也會相關(guān)的發(fā)生改變,從而避免多余字段被創(chuàng)建,但基于主鍵關(guān)聯(lián)的持久化類(其對應(yīng)的數(shù)據(jù)表稱為從表)不能擁有自己的主鍵生成策略,它的主鍵由關(guān)聯(lián)類負(fù)責(zé)生成。另外,增加one-to-one元素來關(guān)聯(lián)屬性,必須為one-to-one元素增加constrained=”true”屬性,表明該類主鍵由關(guān)聯(lián)類生成。
示例:
實體類:
User.java
public class User {
private int userid;
private String name;
private String password;
private Address address;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
Address.java
public class Address {
private int addressid;
private String addressinfo;
public int getAddressid() {
return addressid;
}
public void setAddressid(int addressid) {
this.addressid = addressid;
}
public String getAddressinfo() {
return addressinfo;
}
public void setAddressinfo(String addressinfo) {
this.addressinfo = addressinfo;
}
}
表結(jié)構(gòu):
user表:
address表:
配置文件:
User.hbm.xml
address
Address.hbm.xml
測試類Test.java
public class Test {
public static void main(String[] args){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
User u = new User();
u.setName("sbw");
u.setPassword("123");
Address a = new Address();
a.setAddressinfo("heu");
u.setAddress(a);
session.save(a);
session.save(u);
tx.commit();
HibernateUtil.closeSession();
}
}
運行結(jié)果:
(2)通過外鍵關(guān)聯(lián)
通過外鍵關(guān)聯(lián)時兩張數(shù)據(jù)表的主鍵是不同的,通過在一張表中添加外鍵列來保持一對一的關(guān)系。配置外鍵關(guān)聯(lián)關(guān)系時需要使用many-to-one元素。因為通過外鍵關(guān)聯(lián)的一對一關(guān)系,本質(zhì)上是多對一關(guān)系的特例。因此,只需在many-to-one元素中增加unique=“true”屬性即可,這相當(dāng)于在多的一端增加了唯一性的約束,表示多的一端也必須是唯一的,這樣就變成為單向的一對一關(guān)系了。
示例:
實體類與通過主鍵關(guān)聯(lián)相同。
表結(jié)構(gòu):
user表
address表
配置文件:
User.hbm.xml
Address.hbm.xml
測試類與通過主鍵關(guān)聯(lián)一樣
運行結(jié)果:
2.單向一對多關(guān)聯(lián)
單向的一對多關(guān)聯(lián)映射關(guān)系主要是通過外鍵來關(guān)聯(lián)的。一對多的關(guān)聯(lián)映射是在表示多的一方的數(shù)據(jù)表中增加一個外鍵,并由“一”的一方指向“多”的一方。單向的一對多關(guān)聯(lián)的持久化類里需要包含一個集合屬性,在“一”的一方訪問“多”的一方時,“多”的一方將以集合的形式來體現(xiàn)。
示例:
實體類:
User.java
public class User {
private int userid;
private String name;
private String password;
private Set address = new HashSet();
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Set getAddress() {
return address;
}
public void setAddress(Set address) {
this.address = address;
}
}
Address.java
public class Address {
private int addressid;
private String addressinfo;
public int getAddressid() {
return addressid;
}
public void setAddressid(int addressid) {
this.addressid = addressid;
}
public String getAddressinfo() {
return addressinfo;
}
public void setAddressinfo(String addressinfo) {
this.addressinfo = addressinfo;
}
}
表結(jié)構(gòu):
User表
Address表
配置文件
User.hbm.xml
Address.hbm.xml
測試代碼
Test.java
public class Test {
public static void main(String[] args){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
User u = new User();
u.setName("sbw");
u.setPassword("123");
Address a = new Address();
a.setAddressinfo("heu");
Address a1 = new Address();
a1.setAddressinfo("hrb");
u.getAddress().add(a);
u.getAddress().add(a1);
session.save(a);
session.save(a1);
session.save(u);
tx.commit();
HibernateUtil.closeSession();
}
}
運行結(jié)果:
3.單向的多對一關(guān)聯(lián)
單向的多對一關(guān)聯(lián)映射關(guān)系也是通過外鍵來關(guān)聯(lián)的。多對一的映射方式類似于一對多的映射方式,不過它的映射關(guān)系是由“多”的一方指向“一”的一方。在表示“多”的一方的數(shù)據(jù)表中增加一個外鍵來指向表示“一”的一方的數(shù)據(jù)表,“一”的一方作為主表,”多“的一方作為從表。
示例:
實體類
User.java
public class User {
private int userid;
private String name;
private String password;
private Address address = new Address();
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
Address.java
public class Address {
private int addressid;
private String addressinfo;
public int getAddressid() {
return addressid;
}
public void setAddressid(int addressid) {
this.addressid = addressid;
}
public String getAddressinfo() {
return addressinfo;
}
public void setAddressinfo(String addressinfo) {
this.addressinfo = addressinfo;
}
}
表結(jié)構(gòu):
user表
address表
配置文件:
User.hbm.xml
Address.hbm.xml
測試類Test.java
public class Test {
public static void main(String[] args){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
User u = new User();
u.setName("sbw");
u.setPassword("123");
User u1 = new User();
u.setName("gaoya");
u.setPassword("456");
Address a = new Address();
a.setAddressinfo("heu");
u.setAddress(a);
u1.setAddress(a);
session.save(a);
session.save(u);
session.save(u1);
tx.commit();
HibernateUtil.closeSession();
}
}
測試結(jié)果:
4.單向的多對多關(guān)聯(lián)
多對多關(guān)聯(lián)在數(shù)據(jù)庫中是比較常見的,它利用中間表將兩個主表關(guān)聯(lián)起來。中間表的作用是將兩張表的主鍵作為其外鍵,通過外鍵建立這兩張表的映射關(guān)系。在單向的多對多關(guān)聯(lián)中,需要在主控端的類定義中增加一個Set集合屬性,使得被關(guān)聯(lián)一方的類的實例以集合的形式存在。
示例:
實體類:
User.java
public class User {
private int userid;
private String name;
private String password;
private Set address = new HashSet();
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Set getAddress() {
return address;
}
public void setAddress(Set address) {
this.address = address;
}
}
Address.java
public class Address {
private int addressid;
private String addressinfo;
public int getAddressid() {
return addressid;
}
public void setAddressid(int addressid) {
this.addressid = addressid;
}
public String getAddressinfo() {
return addressinfo;
}
public void setAddressinfo(String addressinfo) {
this.addressinfo = addressinfo;
}
}
表結(jié)構(gòu):
user表:
user_address表:
address表:
配置文件:
User.hbm.xml
Address.hbm.xml
測試代碼Test.java
public class Test {
public static void main(String[] args){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
User u = new User();
u.setName("sbw");
u.setPassword("123");
User u1 = new User();
u1.setName("gaoya");
u1.setPassword("456");
Address a = new Address();
a.setAddressinfo("heu");
Address a1 = new Address();
a1.setAddressinfo("hrb");
u.getAddress().add(a);
u.getAddress().add(a1);
u1.getAddress().add(a);
u1.getAddress().add(a1);
session.save(a);
session.save(a1);
session.save(u);
session.save(u1);
tx.commit();
HibernateUtil.closeSession();
}
}
測試結(jié)果:
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com