hibernate学习-两表关联(一对多,多对多,自关联)注解配置-第6天

  关联关系,是使用最多的一种关系,非常重要。在内存中反映为实体关系,映射到 DB
中为主外键关系。实体间的关联,即对外键的维护。关联关系的发生,即对外键数据的改
变。外键:外面的主键,即,使用其它表的主键值作为自已的某字段的取值。

一、基本概念

前4个请查看 Hibernate5讲义
5、关联方向
(1)单向关联
指具有关联关系的实体对象间的加载与访问关系是单向的。即,只有一个实体对象可
以加载和访问对方,但对方是看不到另一方的。
(2)双向关联
指具有关联关系的实体对象间的加载与访问关系是双向的。即,任何一方均可加载和
访问另一方。
6、关联数量
实体对象间的关系,从数量上可以划分为:1:1,1:n,n:1,m:n 。

二、关系映射

demo代码路径:https://github.com/MisterChegy/hibernate

(1)1:n-单向关联

model类 (get,set方法略过)

/**
 * 一对多单向关联
 */
@Entity
@Table(name = "minister", catalog = "test")
public class Minister implements java.io.Serializable {

	// Fields

	private Integer mid;
	private String mname;

/**
 *一对多单向关联
 */
@Entity
@Table(name = "country", catalog = "test")
public class Country implements java.io.Serializable {

	@Id
	@Column(name = "cid", unique = true, nullable = false)
	private Integer cid;
	
	@Column(name = "cname", length = 45)
	private String cname;
	//关联属性
	@OneToMany(targetEntity = Minister.class, cascade=CascadeType.ALL)
	//用来指定与所操作实体或实体集合相关联的数据库表中的列字段
	@JoinColumn(name="cid")
	private Set<Minister> ministers = new HashSet<Minister>(0);

测试

/*
	 * 去掉cascade = CascadeType.ALL和mappedBy =
	 * "country",即取消级联保存和多端维护,然后添加@JoinColumn(name="cid")
	 * 添加@JoinColumn(name="cid")可以避免生成中间表
	 *
	 * 一对多单向关联
	 */
	@Test
	public void test01() {
		try {
			session.beginTransaction();

			model2.Minister minister1 = new model2.Minister(1, "aaa");
			Set<model2.Minister> ministers = new HashSet<model2.Minister>();
			ministers.add(minister1);

			model2.Country country = new model2.Country(1, "USA");
			country.setMinisters(ministers);

			System.out.println("country = " + country);

			session.save(country);
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}
	}

结果

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值