作业做的有点迷 不太明白 这次的。
https://blog.csdn.net/yerenyuan_pku/article/details/70152173点击打开链接
https://blog.csdn.net/xjy_1666/article/details/79160414点击打开链接
二、实验内容:
1. 单向的多对一关联映射;
2. 双向的一对一关联映射(基于主键或外键);
3. 单向的一对多关联映射;
四、实验过程及结果:
- 单向的多对一关联映射;(多个卡被一个人所有)
结果如图一
代码:
<hibernate-mapping package="com.Entity.User">
<class name="Card" table="card">
<id name="id"column="id">
<generator class="identity"/></id>
<property name="name"column="name"/>
<many-to-one name="user"class="com.Entity.User.User" column="userId" >
</many-to-one>
</class>
</hibernate-mapping>
package com.Entity.User;
importorg.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
importorg.hibernate.cfg.Configuration;
import org.junit.Test;
publicclass CardTest {
Configuration cfg = null;
SessionFactory sf = null;
Session s = null;
Transaction ts = null;
@Test
publicvoid add(){
try {
cfg = new Configuration().configure();
sf = cfg.buildSessionFactory();
s = sf.openSession();
ts = s.beginTransaction();
User user1=new User();
user1.setUserId(2);
// User user2=new User();
// user2.setUserId(2);
Card card1=new Card();
card1.setName("spring");
Card card3=new Card();
card3.setName("springboot");
card1.setUser(user1);
card3.setUser(user1);
s.save(card1);
s.save(card3);
ts.commit();
} catch (HibernateException e) {
if(ts != null)
{
ts.rollback();
}
e.printStackTrace();
}finally{
if(s != null){
s.close();
}
}
}
}
2双向的一对一关联映射(基于主键或外键);
<hibernate-mapping package="com.Entity.User">
<class name="User" table="user">
<id name="userId"column="userId">
<generator class="identity">
<!-- property只关联对象 -->
<param name="property">card</param>
</generator>
</id>
<property name="userName"column="userName"/>
<property name="password"column="password"/>
<property name="gender"column="gender"/>
<!-- 一个用户关联多个卡 -->
<!--
使用set来描述在一的一方中关联的多,也即Set<cards>
它的name属性就是Set集合的名称:cards
key:它主要描述关联的多的一方产生的外键名称,注意要与多的一方定义的外键名称相同
one-to-many:主要描述集合中的类型
-->
<!-- <set name="cards" cascade="save-update">
<key column="userId"/>
<one-to-many class="com.Entity.User.Card"/>
</set>
-->
<!-- <one-to-one name="card" property-ref="user"/>-->
<!--constrained="true"表示person引用了idCard的主键作为外键-->
<!-- one-to-one指示hibernate如何加载其关联对象,默认根据主键加载
也就是拿到关系字段值,根据对端的主键来加载关联对象
-->
<one-to-one name="card"constrained="true" cascade="all" property-ref="id"/>
</class>
</hibernate-mapping>
<hibernate-mapping package="com.Entity.User">
<class name="Card" table="card">
<id name="id"column="id">
<generator class="identity">
<!-- property只关联对象 -->
<param name="property">user</param>
</generator>
</id>
<property name="name"column="name"/>
<many-to-one name="user" class="com.Entity.User.User"column="userId"
cascade="all"unique="true" >
</many-to-one>
</class>
</hibernate-mapping>
3单向的一对多关联映射;(一个人有多个卡)
实验结果如图
代码:
<hibernate-mapping package="com.Entity.User">
<class name="User" table="user">
<id name="userId"column="userId">
<generator class="identity"/></id>
<property name="userName"column="userName"/>
<property name="password"column="password"/>
<property name="gender"column="gender"/>
<!-- 一个用户关联多个卡 -->
<!-- 使用set来描述在一的一方中关联的多,也即Set<cards>它的name属性就是Set集合的名称:cardskey:它主要描述关联的多的一方产生的外键名称,注意要与多的一方定义的外键名称相同one-to-many:主要描述集合中的类型-->
<set name="cards" cascade="save-update">
<key column="userId"/>
<one-to-many class="com.Entity.User.Card"/>
</set>
</class>
</hibernate-mapping>
@Test
publicvoid OneToMore(){
try {
cfg = new Configuration().configure();
sf = cfg.buildSessionFactory();
s = sf.openSession();
ts = s.beginTransaction();
User user1=new User();
user1.setUserName("mybatis");
user1.setPassword("hiber");
Card card1=new Card();
card1.setName("springmvc");
Card card3=new Card();
card3.setName("springboot");
user1.getCards().add(card1);
user1.getCards().add(card3);
s.save(user1);
ts.commit();
} catch (HibernateException e) {
if(ts != null)
{
ts.rollback();
}
e.printStackTrace();
}finally{
if(s != null){
s.close();
}
}
}