前序:一对多:是相对于一的一方看多一面,一的一方存放多方的多个对象,存储方式用集合存放
对于配置有两个问题需要弄清楚:
0、本文中的两个实体类
UserClass.java:一个UserClass对象多个User对象
User.java :一个User对像对应一个UserClass或不对应
1、配置的各个属性:
UserClass.bhm.xml的集合配置:
name="users":指定UserClass对象中存放多个User对象集合的名称
table="t_user":指定User对象所对应的表名称
cascade=“all”:表示级联操作当前集合中的对象,如果存在update、不存在save、
column="uc_id":指定当前指向多个User对象的外键字段
class="com.wolf.pojo.oneToone.UserT":指向多的个对象的User类
<set name="users" table="t_user" cascade="all" >
<key column="uc_id"></key>
<one-to-many class="com.wolf.pojo.oneToone.UserT"/>
</set>
User.bhm.xml的集合配置:
其中两个就不介绍了
column="u_uc_id":指定当前(本表或本类)外键的字段
<many-to-one name="userclass" class="com.wolf.pojo.oneToone.UserClass" column="u_uc_id" ></many-to-one>
注意:<key column="u_uc_id"></key>和<many-to-one name="userclass" class="com.wolf.pojo.oneToone.UserClass" column="u_uc_id" ></many-to-one>
指向的都是多的一端字段(一对多)
2、运行的详细说明
1、如果程序一的一端,使用Set集合保存数据,如果继续添加数据只需获得集合直接add方法添加
UserClass usercls=new UserClass();
usercls.setId(UUID.randomUUID().toString());
UserT user=new UserT();
user.setId(UUID.randomUUID().toString());
user.setName("user0");
user.setAge(0);
user.setPrice(0.1);
user.setDatet(new Date());
user.setUserclass(usercls);
usercls.getUsers().add(user);//添加数据
2、如果程序一的一端,使用Set集合保存数据,并且继续添加数据需要注意的一个地方,就是不能直接new Set集合否则,会将以前的数据刷掉(不代表删除,应用字段为null)
UserClass usercls=(UserClass) session.get(UserClass.class, "2240f0af-7dc6-4701-ba22-9b3cbaf0b827");
usercls.setUsers(new HashSet<UserT>());
注意:如果继续添加采用1的方法,如果想从新添加可以使用2的方法,但是第二种方法会产生垃圾数据在数据库中(需定时删除为null的引用数据),
代码:
1、创建表:
create table t_user(
u_id varchar(255),
u_name varchar(255),
u_age Integer,
u_price double(5,2),
u_uc_id varchar(255),
t_datet datetime,
primary key(u_id)
);
create table t_user_class(
uc_id varchar(255),
uc_classNo Integer,
uc_funds double(5,2),
uc_back varchar(255),
primary key(uc_id)
);
2、配置文件:
UserClass.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.wolf.pojo.oneToone">
<class name="UserClass" table="t_user_class">
<id name="id" column="uc_id"/>
<property name="classNo" column="uc_classNo"/>
<property name="funds" column="uc_funds"/>
<property name="back" column="uc_back"/>
<!-- inverse="true":关系维护由UserClass负责维护 -->
<set name="users" table="t_user" cascade="all" >
<key column="u_uc_id"></key>
<one-to-many class="com.wolf.pojo.oneToone.UserT"/>
</set>
</class>
</hibernate-mapping>
User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.wolf.pojo.oneToone" auto-import="false">
<class name="UserT" table="t_user">
<!-- 多对一:只有单项 -->
<id name="id" column="u_id">
</id>
<property name="name" column="u_name"/>
<property name="datet" column="t_datet"/>
<property name="age" column="u_age"/>
<property name="price" column="u_price"/>
<many-to-one name="userclass" class="com.wolf.pojo.oneToone.UserClass" column="u_uc_id" ></many-to-one>
</class>
</hibernate-mapping>
3、java类
public class UserClass implements Serializable{
private String id;
private Integer classNo;
private double funds;
private String back;
private Set<UserT> users=new HashSet<UserT>();
此处略去get、set方法
}
public class UserT implements Serializable{
private String id;
public String name;
private Integer age;
private double price;
private Date datet;
private UserClass userclass;
此处略去get、set方法
}
4、测试代码:
public class UtilMain {
public static void main(String[] args) {
Session session= HibernateSessionFactory.getSession();
Transaction tr=session.beginTransaction();
// UserClass usercls=(UserClass) session.get(UserClass.class, "2240f0af-7dc6-4701-ba22-9b3cbaf0b827");
// usercls.setUsers(new HashSet<UserT>());
UserClass usercls=new UserClass();
usercls.setId(UUID.randomUUID().toString());
UserT user=new UserT();
user.setId(UUID.randomUUID().toString());
user.setName("user0");
user.setAge(0);
user.setPrice(0.1);
user.setDatet(new Date());
user.setUserclass(usercls);
usercls.getUsers().add(user);
session.saveOrUpdate(usercls);
tr.commit();
}
}