首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Hibernate-学习札记06-Relationship-One2One

2012-12-20 
Hibernate-学习笔记06-Relationship-One2OneHibernate真的很强大,尤其是在关系这方便,方便到只要你愿意,以

Hibernate-学习笔记06-Relationship-One2One

Hibernate真的很强大,尤其是在关系这方便,方便到只要你愿意,以后数据库中的表都不需要亲自动手建立了。

?

OneToOne RelationShip

?

1、通过XML来建立Relationship

2、通过Annotation来建立Relations

?

个人建议,Annotation非常简单,也非常容易上手,一旦用上就再也不想使用XML了。

但作为一个初学者,还是应该从XML文件入手,毕竟走都会了离跑还远吗,不差那几分钟。

?

在上代码前先上一个方法,SchemaExport(),用来测试查看DDL语句

public void testSchemaExport(){new SchemaExport(new Configuration().configure()).create(false, false);}

?

直接上代码

XML:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.ibm.hibernate.model"><class name="StudentIdCard" table="STUDENTIDCARD"><id name="id" column="ID"><generator column="num"></property><many-to-one name="student" column="STUDENTID" unique="true"></many-to-one></class></hibernate-mapping>
?

输出结果:

20:39:34,593 DEBUG SchemaExport:377 -
??? create table STUDENTIDCARD (
??????? ID integer not null auto_increment,
??????? num varchar(255),
??????? STUDENTID integer unique,
??????? primary key (ID)
??? )
20:39:34,609 DEBUG SchemaExport:377 -
??? alter table STUDENTIDCARD
??????? add index FKA73F44868BAB53E9 (STUDENTID),
??????? add constraint FKA73F44868BAB53E9
??????? foreign key (STUDENTID)
??????? references STUDENT (ID)

?

从结果看出Hibernate先生成一张表将STUDNETID设置成为唯一,然后修改表内容将STUDENTID设置为外键 同时参考STUDENT表中的ID字段

?

Annotation:

@Entitypublic class Wife {private Husband husband;private int id;private String name;@OneToOne //设置为一对一的关系public Husband getHusband() {return husband;}@Id@GeneratedValuepublic int getId() {return id;}public String getName() {return name;}public void setHusband(Husband husband) {this.husband = husband;}public void setId(int id) {this.id = id;}public void setName(String name) {this.name = name;}}
?
@Entitypublic class Husband {private int id;private String name;@Id@GeneratedValuepublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

?

输出结果:

20:45:01,281 DEBUG SchemaExport:377 -
??? create table Husband (
??????? id integer not null auto_increment,
??????? name varchar(255),
??????? primary key (id)
??? )
20:45:01,281 DEBUG SchemaExport:377 -
??? create table Wife (
??????? id integer not null auto_increment,
??????? name varchar(255),
??????? husband_id integer,
??????? primary key (id)
??? )

20:45:01,281 DEBUG SchemaExport:377 -
??? alter table Wife
??????? add index FK292331542128F2 (husband_id),
??????? add constraint FK292331542128F2
??????? foreign key (husband_id)
??????? references Husband (id)

同样结果是先生成一张表,好玩的是Hibernate没有将Husband对象存入数据库,当然数据库中也没有对应的属性。

Hibernate是这样做的:

1、将Husband当作一个对象,得到这个对象的PK,生成Husband_id int型

2、修改表结果,将Husband_id设置成为外键 参考Husband中的id字段

?

?

结论:

使用XML文件的时候将对象存入数据是更具用户定义,如下

<many-to-one name="student" column="STUDENTID" unique="true"></many-to-one>

用户说将student在数据库中存成StudentID的形式,Hibernate就在数据库中存成StudentID,同时Hibernate知道要去参考Student中的PK。同时还要将对象设置成唯一,毕竟XML中的OneToOne是从ManyToOne转换过来的。

?

使用Annotation的时候用户完全不用去操心了,一句简单定义搞定,如下;

@OneToOne

剩下的Hibernate完全搞定,也不用设置unique。Hibernate知道将对象参考对象PK生成外键存入数据库。(个人比较喜欢Annotation,一个@就能搞定一起,中间的过程完全不用操心)

?

区别:

就一点Annotation更简单

?

?

?

?

?

?

?

热点排行