📄 用hibernate和spring开发事务持久层.htm
字号:
<P> 清单 1. 将 Java 类映射到 DB 表<BR> [User.java]</P>
<P style="BACKGROUND: #eeeeee">/**<BR> *
@hibernate.class table="TBL_USER"<BR> *
..<BR> * ..<BR> * ...<BR> */<BR>public
class User {<BR><BR> private Long id = new
Long(-1);<BR> private String
email;<BR> private String
password;<BR> <BR> .<BR> .<BR> .<BR><BR> /**<BR>
* @return<BR> * @hibernate.id column="PK_USER_ID"
<BR> * unsaved-value="-1" <BR> *
generator-class="native" <BR>
*/<BR> public Long getId() {<BR> return
id;<BR> }<BR><BR> ...<BR><BR> /**<BR>
* @hibernate.property column="VC_EMAIL" <BR> *
type="string" <BR> * update="false"<BR> *
insert="true"<BR> * unique="true"<BR> *
not-null="true"<BR> * length="82" <BR> *
@return<BR> */<BR> public String getEmail()
{<BR> return
email;<BR> }<BR><BR> /**<BR> *
@hibernate.property column="VC_PASSWORD" <BR> *
type="string" <BR> * update="false"<BR> *
insert="true"<BR> * unique="true"<BR> *
not-null="true"<BR> * length="20" <BR> *
@return<BR> */<BR> public String
getPassword() {<BR> return
password;<BR> }<BR><BR> ...<BR> ...<BR> ...<BR>}</P>
<P> 可以看到,@hibernate.class table="TBL_USER" 标签将 User 映射到
TBL_USER 表。@hibernate.property column="VC_PASSWORD" 将
JavaBean 属性 password 映射到 VC_PASSWORD 列。@hibernate.id
column="PK_USER_ID" 标签声明id
属性是主键,它将使用本机(generator-class="native")数据库机制生成键(例如,Oracle
sequences 和 SQL Server Identity 键)。Hibernate 可以指定
generator-class="native" 以外的、其他可以想象的得到主键获得策略,不过我更愿意使用
native。type 和 length 属性用于从 Hibernate *.hbm.xml OR
映射文件生成表。这些 final 属性是可选的,因为使用的可能不是 green-field
数据库。在这个例子中,已经有数据库了,所以不需要额外的属性。(green-field 应用程序
是一个新的应用程序, green-field 数据
是新应用程序的一个新数据库。不会经常开发一个全新的应用程序,不过偶尔有一两次也不错)。</P>
<P> 看过了表如何映射到类以及列如何映射到 JavaBean 属性,该使用 Hibernate 在 OR
数据库中设置一些关系了。</P>
<P> <STRONG>设置对象关系</STRONG></P>
<P> 在本节中,我将只触及 Hibernate 提供的设置对象间关系的选项的一小部分。首先设置像
User、User Group、Roles 和 ContactInfo 这些类之间的关系。其中一些关系如图 1
所示,这是数据库的验证对象模型。</P>
<P align=center><IMG height=286
src="用Hibernate和Spring开发事务持久层.files/20041223180912100.jpg"
width=600><BR>图 1. 关系的图示</P>
<P> 如您所见,在上述抽象中存在各种各样的关系。User 与 ContactInfo
有一对一关系。ContactInfo 的生命周期与 User 相同(用数据库的术语,UML 中的组成 aka
级联删除)。如果删除 User,则相应的 ContactInfo 也会删除。在 Users 与 Roles
之间存在多对多关系(即与独立生命周期相关联)。在 Groups 与 Users
之间存在一对多关系,因为组有许多用户。用户可以存在于组外,即是 aggregation 而不是
composition (用数据库的说法,在 Groups 和 Users
之间没有级联删除关系)。此外,User 和 Employee 有子类关系,就是说,Employee 的类型为
User。表 1 显示了如何用 XDoclet 标签创建一些不同类型的对象关系。</P>
<DIV align=center>表 1. 用 XDoclet 创建对象关系</DIV>
<TABLE cellSpacing=1 cellPadding=1 width=690
align=center bgColor=#999999 border=0>
<TBODY>
<TR bgColor=#ffffff>
<TD align=middle height=25><STRONG>关系</STRONG></TD>
<TD align=middle
height=25><STRONG>Java/XDoclet</STRONG></TD>
<TD align=middle height=25><STRONG>SQL DDL(由
Hibernate Schema Export 生成的 MySQL)</STRONG></TD></TR>
<TR bgColor=#ffffff>
<TD
height=25><STRONG>组包含用户</STRONG><BR>一对多<BR>Aggregation<BR>双向<BR>(Group<-->Users)</TD>
<TD height=25>[Group.java]<BR>/**<BR>* <BR>*
@return<BR>* <BR>* @hibernate.bag
name="users"<BR>* cascade="save-update"<BR>*
lazy="true"<BR>* inverse="true"<BR>* <BR>*
@hibernate.collection-key <BR>*
column="FK_GROUP_ID"<BR>* <BR>*
@hibernate.collection-one-to-many <BR>*
class="net.sf.hibernateExamples.User"<BR>*/<BR>public
List getUsers() {<BR>return users;<BR>}
<P>[User.java]<BR>/**<BR>* @hibernate.many-to-one
<BR>* column="FK_GROUP_ID" <BR>*
class="net.sf.hibernateExamples.Group"<BR>*/<BR>public
Group getGroup() {<BR>return group;<BR>}</P></TD>
<TD height=25>create table TBL_USER
(<BR>PK_USER_ID BIGINT NOT NULL
AUTO_INCREMENT,<BR>USER_TYPE VARCHAR(255) not
null,<BR>FK_GROUP_ID BIGINT,<BR>VC_EMAIL
VARCHAR(82) not null unique,<BR>primary key
(PK_USER_ID)<BR>)
<P><BR>create table TBL_GROUP (<BR>PK_GROUP_ID
BIGINT NOT NULL AUTO_INCREMENT,<BR>VC_DESCRIPTION
VARCHAR(255),<BR>VC_NAME VARCHAR(40)
unique,<BR>primary key (PK_GROUP_ID)<BR>)</P>
<P>alter table TBL_USER add index (FK_GROUP_ID),
<BR>add constraint FK_111 foreign key
(FK_GROUP_ID) <BR>references TBL_GROUP
(PK_GROUP_ID)</P></TD></TR>
<TR bgColor=#ffffff>
<TD
height=25><STRONG>用户有联系信息</STRONG><BR>一对一<BR>Composition
<BR>单向<BR>(User-->ContactInfo)</TD>
<TD height=25>[User.java]<BR>/**<BR>* @return<BR>*
<BR>* @hibernate.one-to-one cascade="all" <BR>*
<BR>*/<BR>public ContactInfo getContactInfo()
{<BR>return contactInfo;<BR>}
<P>[ContactInfo.java]<BR>(Nothing to see here.
Unidirectional!)</P></TD>
<TD height=25>create table TBL_USER
(<BR>PK_USER_ID BIGINT NOT NULL
AUTO_INCREMENT,<BR>USER_TYPE VARCHAR(255) not
null,<BR>FK_GROUP_ID BIGINT,<BR>VC_EMAIL
VARCHAR(82) not null unique,<BR>primary key
(PK_USER_ID)<BR>)
<P>create table TBL_CONTACT_INFO
(<BR>PK_CONTACT_INFO_ID BIGINT not
null,<BR>...<BR>...<BR>...<BR>primary key
(PK_CONTACT_INFO_ID)<BR>)</P></TD></TR>
<TR bgColor=#ffffff>
<TD
height=25><STRONG>用户与角色关联</STRONG><BR>多对多<BR>Association<BR>单向<BR>(Users-->Roles)</TD>
<TD height=25>[User.java]<BR>/**<BR>* @return<BR>*
@hibernate.bag <BR>*
table="TBL_JOIN_USER_ROLE"<BR>* cascade="all"<BR>*
inverse="true"<BR>* <BR>*
@hibernate.collection-key <BR>*
column="FK_USER_ID"<BR>* <BR>*
@hibernate.collection-many-to-many <BR>*
class="net.sf.hibernateExamples.Role" <BR>*
column="FK_ROLE_ID"<BR>* <BR>*/<BR>public List
getRoles() {<BR>return roles;<BR>}
<P>[Role.java]<BR>Nothing to see here.
Unidirectional!</P></TD>
<TD height=25>create table TBL_ROLE
(<BR>PK_ROLE_ID BIGINT NOT NULL
AUTO_INCREMENT,<BR>VC_DESCRIPTION
VARCHAR(200),<BR>VC_NAME VARCHAR(20),<BR>primary
key (PK_ROLE_ID)<BR>)
<P>create table TBL_USER (<BR>PK_USER_ID BIGINT
NOT NULL AUTO_INCREMENT,<BR>USER_TYPE VARCHAR(255)
not null,<BR>FK_GROUP_ID BIGINT,<BR>VC_EMAIL
VARCHAR(82) not null unique,<BR>primary key
(PK_USER_ID)<BR>)</P>
<P>create table TBL_JOIN_USER_ROLE (<BR>FK_USER_ID
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -