Hibernate的单向关联映射应用

来源:互联网 发布:js的面向对象编程理解 编辑:程序博客网 时间:2024/05/29 13:28

一、简述

一、单向N-1关联单向N-1关系,比如多个人对应一个地址,只需从人实体端可以找到对应的地址实体,无须关系某个地址的全部住户。单向 n-1 关联只需从 n 的一端可以访问 1 的一端。二、单向1-1关联从持久化的代码上看,单向1-1与单向N-1没有丝毫区别。三、N-N关系持久化类里需要使用集合属性,此时集合里的元素是关联实体

二、简单例子
1、数据库表

person表:CREATE TABLE `person` (  `personId` int(50) NOT NULL AUTO_INCREMENT,  `personName` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,  `personAge` int(50) DEFAULT NULL,  `addressId` int(11) DEFAULT NULL,  PRIMARY KEY (`personId`)) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ciaddress表:CREATE TABLE `address` (  `addressId` int(50) NOT NULL AUTO_INCREMENT,  `addressDetail` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,  PRIMARY KEY (`addressId`)) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ciperson_address表:CREATE TABLE `person_address` (  `addressId` int(50) NOT NULL AUTO_INCREMENT,  `personId` int(50) DEFAULT NULL,  PRIMARY KEY (`addressId`)) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

2、实体

package com;import java.util.HashSet;import java.util.Set;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;import javax.persistence.Table;import org.hibernate.annotations.Cascade;@Entity@Table(name="person")public class Person {    @Id    @Column(name="personId")    @GeneratedValue(strategy=GenerationType.IDENTITY)    private Integer personId;    @Column(name="personName")    private String personName;    @Column(name="personAge")    private Integer personAge;    //----------------单向N-1关联Begin-------------//    //========无连接表(中间表)的N-1关联===========//    //  //定义该Person实体关联的Address实体    //  @ManyToOne(targetEntity=Address.class)    //  //映射外键列,指定外键列的列名为addressId    //  @JoinColumn(name="addressId",nullable=false)    //  @Cascade(CascadeType.ALL)    //========有连接表(中间表)的N-1关系============//    //定义该Person实体关联的Address实体    //  @ManyToOne(targetEntity=Address.class)    //  //显式使用@joinTable映射连接表    //  @JoinTable(name="person_address",//指定连接表的表名为person_address    //  //指定连接表中personId外键列,参考当前 实体对应表的主键列    //  joinColumns=@JoinColumn(name="personId",referencedColumnName="personId",unique=true),    //  //指定连接表中addressId外键列,参照当前实体 关联实体 对应表的主键列    //  inverseJoinColumns=@JoinColumn(name="addressId",referencedColumnName="addressId")    //  )    //  @Cascade(CascadeType.ALL)    //-----------------单向N-1关联END----------------//    //-----------------单向1-1关联Begin------------------//    //==================基于外键的单向1-1关联===============//    //定义该person实体关联的Address实体    //  @OneToOne(targetEntity=Address.class)    //  //映射名为addressId的外键列,参照关联实体对应表addressId主键列    //  @JoinColumn(name="addressId",    //  //指定连接表中addressId外键列,参照当前实体关联实体对应表的主键列      //  referencedColumnName="addressId",unique=true)    //  @Cascade(CascadeType.ALL)    //===================有连接表(中间表)的1-1关联============//    //  @OneToOne(targetEntity=Address.class)    //  @JoinTable(name="person_address",//指定连接表的表名为person_address    //    //用于配置连接表中外键列信息,这些外键列参照当前实体对应表的主键列    //  joinColumns=@JoinColumn(name="personId",referencedColumnName="personId",unique=true),    //  //用于配置连接表中外键列信息,这些外键列参照当前实体关联实体对应的主键列    //  inverseJoinColumns=@JoinColumn(name="addressId",referencedColumnName="addressId",unique=true)    //  )    //  @Cascade(CascadeType.ALL)    //=====================单向1-1关联End==================//    //=====================单向N-N关联=====================//    //定义该Person实体所有关联的Address实体    @ManyToMany(targetEntity=Address.class)    //映射链接表为person_address    @JoinTable(name="person_address",    //定义连接表中名为person_id的外键列,该外键参照当前实体对应的主键列    joinColumns=@JoinColumn(name="personId",referencedColumnName="personId"),    //定义连接表中名为address_id的外键列,该外键列参照当前实体关联实体对应表的主键列,没有指定unique=true    inverseJoinColumns=@JoinColumn(name="addressId",referencedColumnName="addressId")    )    @Cascade(org.hibernate.annotations.CascadeType.ALL)    //======================单向N-N关联End====================//    private Set<Address> addresses=new HashSet();    /**      *        * //  private Address address;        //  public Address getAddress() {        //      return address;        //  }        //  public void setAddress(Address address) {        //      this.address = address;        //  }     *      * @return     */    public Integer getPersonId() {        return personId;    }    public void setPersonId(Integer personId) {        this.personId = personId;    }    @Column(name="personName")    public String getPersonName() {        return personName;    }    public void setPersonName(String personName) {        this.personName = personName;    }    @Column(name="personAge")    public Integer getPersonAge() {        return personAge;    }    public void setPersonAge(Integer personAge) {        this.personAge = personAge;    }    public Set<Address> getAddresses() {        return addresses;    }    public void setAddresses(Set<Address> addresses) {        this.addresses = addresses;    }}package com;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name="address")public class Address {    @Id     @Column(name="addressId")    @GeneratedValue(strategy=GenerationType.IDENTITY)     private Integer addressId;    private String addressDetail;    public Address(){    }    public Address(String addressDetail){        this.addressDetail=addressDetail;    }    public Integer getAddressId() {        return addressId;    }    public void setAddressId(Integer addressId) {        this.addressId = addressId;    }    @Column(name="addressDetail")    public String getAddressDetail() {        return addressDetail;    }    public void setAddressDetail(String addressDetail) {        this.addressDetail = addressDetail;    }}

3、测试类

package com;import java.util.HashSet;import java.util.Set;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;public class TestPerson {    public static void main(String[] args) {        Configuration config=new Configuration().configure();        SessionFactory sfy=config.buildSessionFactory();        Session session=sfy.openSession();        Transaction tx=session.beginTransaction();        Person p=new Person();        Address a=new Address("茂名市茂南区N_N有连接表");        p.setPersonName("person_N_N有连接关联");        p.setPersonAge(25);        // p.setAddress(a);        //持久化person对象        session.persist(p);        Address a2=new Address("茂名市化州市N_N有连接关联");        //修改持久状态的p2        //p.setAddress(a2);        Set<Address> addresses=new HashSet<Address>();        addresses.add(a);        addresses.add(a2);        p.setAddresses(addresses);        tx.commit();        session.close();        sfy.close();    }}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微厨房网络科技 安微科技学院 深圳市东微智能科技有限公司 微能科技 微科技 微秒转 秘书怎么样 微积分公式 微积分 微积分是什么 微积分入门 微积分基本定理 微积分公式大全 微积分能自学吗 微积分自学 经济数学微积分 微积分算个屁 微积分学教程 大学微积分 托马斯微积分 微积分题目 微积分答案详解 微积分答案 微积分教程 微积分例题 ap 微积分 微积分是谁发明的 ap微积分家教 ap微积分 ap微积分培训 微积分的应用领域 微积分之屠龙宝刀 ap 微积分真题 一元微积分 微积分表 微积分基础知识 bshare微积分 微积分ap真题 微积分功 微积分公式表 什么是微积分