为了能更直观得在cmd里查看结果,我使用了mysql数据库;为了更容易测试及更好的理解,项目里只加入了hibernate所需要的包,而没有使用spring框架,这样显得更清爽些~
今天先总结一对一主键关联,举得例子是学生和座位,一个人对应一个座位,一个座位对应一个人,分别用User 和 Seat 来代替。
一 安装好mysql数据库
通过cmd进入mysql,新建一个数据库,在其中创建两表:
二 在Eclipse中新建project,建好目录,在WEB-INF/lib中加入hibernate所必需的包:hibernate3.2.5.jar、cglib-asm.jar、dom4j.jar、odmg.jar、commons-collections.jar、commons-beanutils.jar、commons-lang.jar、commons-logging.jar、jta.jar、log4j.jar; 加入mysql jdbc驱动包 。刷新项目,在项目properties中把buildpath设置好。
在JavaSource中的model包中,加入两实体类User.java User.hbm.xml Seat.java Seat.hbm.xml ;加入一个测试文件,TestHibernate.java;再在JavaSource中再加入hibernate.cfg.xml文件。
目录结构大体如下:
hibernate.cfg.xml:
User和Seat是一对一主键关联,那么在User.java 里必须包含一个Seat对象,Seat.java 里包含一个User对象。
User.java
Seat.java:
映射文件和实体文件对应,user实体类里有一个seat对象,所以user的xml中需要加入一个seat;同理seat当中要加入一个user;
其中<one-to-one>标签里的name就是实体类对应的关联类的名称,例如User.java中的private Seat seat;
则在user.hbm.xml里写<one-to-one name="seat" class="com.mp.persistence.model.Seat" />
这种关联标签,就是展现当前表与其他表字段的关联关系,如果是一对一,则当前表里肯定有一个字段和另一个表的一字段关联,且是双向的,所以两个表的映射文件里都需要加上one-to-one标签,这样两边的试题对象在代码里都可以get到关联的对象;
User.hbm.xml:
可以使用cascade="all"
将一个关联关系(无论是对值对象的关联,或者对一个集合的关联)标记为父/子关系的关联。 这样对父对象进行save/update/delete操作就会导致子对象也进行save/update/delete操作。 默认值是cascade="none"
,即任何操作都不会被级联(cascaded)。
Seat.hbm.xml:
使用foreign表示与外键共享主键,也就是与User实体共享主键,而constrained设定为true,表示的主键必须与user中对应资料的主键相同。
写测试代码TestHibernate.java:
右键选择Run as /Java Application ,控制台显示:
切换到cmd界面,执行查询语句,可以看到插入数据后的结果: