1、关于实体之间One2One之间的映射实现
2、Person.java的实现
public class Person {
private int id;
private int age;
private String name;
// one2one,持有IdCard
private IdCard idCard;
//get set
}
3、Person.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">
<!-- 配置实体类,所在的package的名称 -->
<hibernate-mapping package="com.hibernate.entity">
<class name="Person" table="person">
<!-- 主键 ,映射 -->
<id name="id" column="id">
<!-- 自动生成主键的规则 -->
<generator class="native" />
</id>
<!-- 非主键,映射 -->
<property name="name" column="name"></property>
<property name="age" column="age"></property>
<!--one2one的映射 -->
<!--1、第一种配置方法 -->
<!--用于保存IdCard的外键 -->
<many-to-one name="idCard" unique="true" column="cardid"></many-to-one>
<!--2、第二种配置方法 -->
<!-- constrained="true",表示Student表的主键收到Idcart主键的约束,相当于同时又是个外键 -->
<!--这种配置方法,Student表的主键,同时也是Idcard表的外键 -->
<!-- <one-to-one name="idCard" constrained="true"></one-to-one> -->
<!--3、一个小的总结 -->
<!--这里面重要的一个知识点就是<many-to-one>和<one-to-one>的区别, -->
<!-- 这里主要应用了这个不同。<many-to-one>不仅可以加载到另一端的数据,还会在多的一端表中加入一个外键 -->
<!-- 而<one-to-one>只会加载另一端数据作为外键约束,不会影响表结构。 -->
</class>
</hibernate-mapping>
4、IdCard.java的实现
public class IdCard {
private int id;
private String idcardnumber;
//get set
}
5、IdCard.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">
<!-- 配置实体类,所在的package的名称 -->
<hibernate-mapping package="com.hibernate.entity">
<class name="IdCard" table="idcart">
<!-- 主键 ,映射 -->
<id name="id" column="id">
<!-- 自动生成主键的规则 -->
<generator class="native" />
</id>
<!-- 非主键,映射 -->
<property name="idcardnumber" column="idcardnumber"></property>
</class>
</hibernate-mapping>
6、hibernate.cfg.xml的配置
6.1 将IdCard.hbm.xml和Person.hbm.xml加入hibernate.cfg.xml中
<!--3.加载实体的映射文件 -->
<mapping resource="com/hibernate/entity/IdCard.hbm.xml" />
<mapping resource="com/hibernate/entity/Person.hbm.xml" />
6..2 hibernate.cfg.xml的完整的配置文件
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- 通常,一个session-factory节点代表一个数据库 -->
<session-factory>
<!-- 1. 数据库连接配置 -->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql:///hibernate
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<!-- 数据库方法配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQL5Dialect
</property>
<!-- 2. 其他相关配置 -->
<!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 2.2 格式化sql -->
<property name="hibernate.format_sql">true</property>
<!-- 2.3 自动建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--3.加载实体的映射文件 -->
<mapping resource="com/hibernate/entity/IdCard.hbm.xml" />
<mapping resource="com/hibernate/entity/Person.hbm.xml" />
</session-factory>
</hibernate-configuration>
7、测试代码
public class HibernateTest {
@Test
public void testone2one() {
Person stu1 = new Person();
stu1.setAge(18);
stu1.setName("18");
IdCard idCard = new IdCard();
idCard.setIdcardnumber("1234567");
// 注册关系
stu1.setIdCard(idCard);
// 保存到数据库
IClassRoomDao roomDao = new ClassRoomDaoImpl();
IStudentDao studentDao = new StudentDaoImpl();
// 保存一的一方
roomDao.add(idCard);
// 保存多的一方
studentDao.add(stu1);
}
}
8、程序运行结果截图
9、代码下载