主要内容:
1.hibernate中 单向一对多关联关系
题外话:
多对一和一对多,本质是一回事。不同的角度而已
一、在数据库里建表
1.建立student表,项目有,id,name,sex,gid。其中把id设为主键,但不设立自增长
2.建立grade表,项目有,gid,gname,gdesc。其中把gid设为主键,但不设立自增长
3.在多方,也就是student表里,建立与grade表的gid的外键关系
二、写持久化类
新建grade.java和student.java两个类
1.序列化
implements Serializable接口,获取序列号
2.添加私有化的id、name等变量,并实现setget方法
三、给各持久化类生成映射文件
用hibernate工具生成下面两个映射文件
Grade.hbm.xml
Student.hbm.xml
具体如下,注意配置:
Grade.hbm.xml
<hibernate-mapping>
<class name="com.yang.one2many.Grade" table="GRADE">
<id name="gid" type="int">
<column name="GID" />
<generator class="increment" />
</id>
<property name="gname" type="java.lang.String">
<column name="GNAME" />
</property>
<property name="gdesc" type="java.lang.String">
<column name="GDESC" />
</property>
<!-- 在一方配置一对多关联关系-->
<set name="student" table="student">
<key column="gid"></key>
<one-to-many class="com.yang.one2many.Student"/>
</set>
</class>
</hibernate-mapping>
Student.hbm.xml
<hibernate-mapping>
<class name="com.yang.one2many.Student" table="STUDENT">
<id name="id" type="int">
<column name="ID" />
<generator class="increment" />
</id>
<property name="sex" type="java.lang.String">
<column name="SEX" />
</property>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
</class>
</hibernate-mapping>
四、配置hibernate.cfg.xml
这个文件在第二步配置也可以。最重要的是配置上面建好的两个映射文件
<hibernate-configuration>
<session-factory>
<!-- 数据库用户名-->
<property name="connection.username">root</property>
<!-- 数据库密码-->
<property name="connection.password">root</property>
<!--mysql的驱动下载 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!--指定数据库名。我创建的是testmysql。后面指定了字符编码,防止数据出现乱码 -->
<property name="connection.url">jdbc:mysql:///one2many?userUnicode=true&characterEncoding=UTF-8</property>
<!-- 数据库方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 在控制台显示sql语句-->
<property name="show_sql">true</property>
<!-- 指定自动更新数据表。也可以配置create:这是自动生成,会覆盖原来数据-->
<property name="hbm.2ddl.auto">update</property>
<!--
<property name="format_sql">true</property>
-->
<!-- 配置映射文件 -->
<mapping resource="com/yang/one2many/Grade.hbm.xml" />
<mapping resource="com/yang/one2many/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>
五、写个测试类来验证一下
写测试类之前,因为session会经常被调用,为了以后调用方便,所以先写个工具类。
HibernateUtil.java
public class HibernateUtil {
private static SessionFactory sessionFactory;
private static Session session;
static{
// 创建配置对象
Configuration configure = new Configuration().configure();
// 创建服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configure.getProperties())
.buildServiceRegistry();
// 创建会话工厂
sessionFactory = configure.buildSessionFactory(serviceRegistry);
}
public static Session getSession(){
// 会话对象
session = sessionFactory.openSession();
return session;
}
public static void closeSession(){
if (session.isOpen() || session!=null) {
session.close();
}
}
}
然后写测试类
创建一个班级和两个学生,看看能不能插入到数据库中。结果OK
Test.java
public class Test {
public static void main(String[] args) {
Test t=new Test();
t.add();
}
public void add(){
Grade grade=new Grade("java一班","优秀班级");
Student stu1=new Student("杨洋","男");
Student stu2=new Student("李丽","女");
grade.getStudent().add(stu1);
grade.getStudent().add(stu2);
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
session.save(grade);
session.save(stu1);
session.save(stu2);
transaction.commit();
HibernateUtil.closeSession();
}
}