Hibernate的关联映射

关联关系有两个分类

        1.单向关系:只需单向访问关联端。例如,只能通过老师访问学生,或者只能通过学生来访问老师。

               单向1------》1

               1)无连接表的1---1关联

                ---个人实体类

package entity;

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.OneToOne;



@Entity
public class Person {
	@Id
	@Column(name="person_id")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;
	private String name;
	private int age;
	// 定义该Person实体关联的Address实体
	@OneToOne(targetEntity=Address.class)
	//@JoinColumn增加了unique=true,这就意味着在person_inf表的address_id外键列上
	//增加唯一约束---实际上形成了单向1-----1关联
	@JoinColumn(name="address_id",referencedColumnName="address_id",unique=true)
	private Address address;

	//省略所有的getter和setter方法。。。
	public Person() {
		super();
	}
	
}
              ----地址实体类

package entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Address {
	@Id
	@Column(name = "address_id")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int addressId;
	private String addressDetail;

	//省略所有getter和setter方法。。。
	public Address() {
		super();
	}
 
}

               ---生成的表结构

               -----个人表

               

               -----地址表

               

               2)有连接表的1---1关联

-----------------------------------------------------------------------------------------------------------------------------------------------------------

               单向1------》N

-----------------------------------------------------------------------------------------------------------------------------------------------------------

               单向N------》1

               1)无连接表的N----1关联

                 --个人实体类

package entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;


@Entity
public class Person {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;
	private String name;
	private int age;
	// 定义该Person实体关联的Address实体
	@ManyToOne(targetEntity = Address.class)
	@JoinColumn(name = "address_id", nullable = false)
	@Cascade(CascadeType.ALL)
	private Address address;
    
        //省略所有get和set方法。。。
	public Person() {
		super();
	}
	
}
           

              --地址实体类

package entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Address {
	@Id
	@Column(name = "address_id")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int addressId;
	private String addressDetail;

	//省略所有getter、setter方法。。。

	public Address() {
		super();
	}
 
}
             --生成的表结构

                ----个人表

             

               -----地址表

           

            

           2)有连接表的N----1关联

               ----个人实体类

package entity;

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.ManyToOne;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;


@Entity
public class Person {
	@Id
	@Column(name="person_id")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;
	private String name;
	private int age;
	// 定义该Person实体关联的Address实体
	@ManyToOne(targetEntity = Address.class)
	//显示使用@JoinTable映射连接表
	@JoinTable(name="person_address",//指定连接表名为person_address
	//指定连接表中person_id外键列,参照到当前实体对应表的外键列
	joinColumns=@JoinColumn(name="person_id",referencedColumnName="person_id",unique=true),
	//指定连接表中address_id外键列,参照到当前实体的关联实体对应表的外键列
	inverseJoinColumns=@JoinColumn(name="address_id",referencedColumnName="address_id")
	)
	@Cascade(CascadeType.ALL)
	private Address address;

        //省略所有getter和setter方法。。。

	public Person() {
		super();
	}
	
}
              ---地址实体类

package entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Address {
	@Id
	@Column(name = "address_id")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int addressId;
	private String addressDetail;

	//省略所有getter和setter方法

	public Address() {
		super();
	}
 
}

              --生成的表结构

                 ---个人表

          

                 ---地址表

          

                 ---个人地址连接表

           

--------------------------------------------------------------------------------------------------------------------------------------------------------

               单向N------》N(N---N必须使用连接表)

--------------------------------------------------------------------------------------------------------------------------------------------------------

               

        2.双向关系:关联的两端可以互相访问。例如,老师和学生之间可以互相访问。 

               双向1------》1

               双向1------》N

               双向N------》N

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值