黑灵客栈
黑灵的没啥技术含量的技术博客! -> http://zjumty.iteye.com
BlogJava
|
首页
|
发新随笔
|
发新文章
|
联系
|
聚合
|
管理
随笔:204 文章:2 评论:243 引用:0
对于昨天User -- Friend关系的解决!
昨天在回复中我写了一个别人给我的解决方案。这种方法简单,但是在数据库的结构上不时很好。
我自己也找了一个方法,但是比较麻烦。
从数据库底层做起,原来我的数据库设计有问题。
我在用PowerDesigner建立概念模型的时候有一定问题。对于Friend表我用的是Entity,其实这个关系不应该是Entity,而应该是Association。如下图:
这样在生成物理数据模型时就会把 host,friend一起作为PK,如果用Entity就只能是FK
这样的结构如果你用工具生成映射文件和Java文件时就会多出一个FriendID的类,里面有两个元素就是host和friend
Friend.hbm.xml的结构如下
<
hibernate-mapping
>
<!--
Auto-generated mapping file from
the hibernate.org cfg2hbm engine
-->
<
class
name
="org.netcatcher.web.model.Friends"
table
="Friends"
schema
="nc"
catalog
="NetCatcher"
>
<
composite-id
name
="id"
class
="org.netcatcher.web.model.FriendsId"
>
<
key-many-to-one
name
="Host"
class
="org.netcatcher.web.model.Customers"
>
<
column
name
="host"
length
="100"
not-null
="false"
/>
</
key-many-to-one
>
<
key-many-to-one
name
="Friend"
class
="org.netcatcher.web.model.Customers"
>
<
column
name
="friend"
length
="100"
not-null
="false"
/>
</
key-many-to-one
>
</
composite-id
>
</
class
>
</
hibernate-mapping
>
FriendID.java如下
public
class
FriendsId implements java.io.Serializable
{
/**/
/*
*
*
*/
private
static
final
long
serialVersionUID
=
3689069555917795889L
;
//
Fields
private
org.netcatcher.web.model.Customers Host;
private
org.netcatcher.web.model.Customers Friend;
//
Constructors
/**/
/*
* default constructor
*/
public
FriendsId()
{
}
//
Property accessors
/**/
/*
*
*/
public
org.netcatcher.web.model.Customers getHost ()
{
return
this
.Host;
}
public
void
setHost(org.netcatcher.web.model.Customers Host)
{
this
.Host
=
Host;
}
/**/
/*
*
*/
public
org.netcatcher.web.model.Customers getFriend ()
{
return
this
.Friend;
}
public
void
setFriend (org.netcatcher.web.model.Customers Friend)
{
this
.Friend
=
Friend;
}
public
boolean equals(Object other)
{
if
( (
this
==
other ) )
return
true
;
if
( (other
==
null
) )
return
false
;
if
(
!
(other instanceof FriendsId) )
return
false
;
FriendsId castOther
=
( FriendsId ) other;
return
(
this
.getHost()
==
castOther.getHost())
||
(
this
.getHost()
==
null
?
false
: (castOther.getHost()
==
null
?
false
:
this
.getHost().equals(castOther.getHost())))
&&
(
this
.getFriend()
==
castOther.getFriend())
||
(
this
.getFriend()
==
null
?
false
: (castOther.getFriend()
==
null
?
false
:
this
.getFriend().equals(castOther.getFriend())));
}
public
int
hashCode()
{
int
result
=
17
;
result
=
37
*
result
+
this
.getHost().hashCode();
result
=
37
*
result
+
this
.getFriend().hashCode();
return
result;
}
}
Friends.java如下:
public
class
Friends implements java.io.Serializable
{
//
Fields
/**/
/*
*
*
*/
private
static
final
long
serialVersionUID
=
3258409517246395959L
;
private
org.netcatcher.web.model.FriendsId id;
//
Constructors
/**/
/*
* default constructor
*/
public
Friends()
{
}
/**/
/*
* constructor with id
*/
public
Friends(org.netcatcher.web.model.FriendsId id)
{
this
.id
=
id;
}
//
Property accessors
/**/
/*
*
*/
public
org.netcatcher.web.model.FriendsId getId ()
{
return
this
.id;
}
public
void
setId (org.netcatcher.web.model.FriendsId id)
{
this
.id
=
id;
}
}
这样你在添加好友列表时要这样:
public
void
addFriend(String hostEmail,String friendEmail)
throws InfrastructureException
{
try
{
HibernateUtil.beginTransaction();
Customers host
=
(Customers)HibernateUtil.getSession()
.load(Customers.
class
,hostEmail);
Customers friend
=
(Customers)HibernateUtil.getSession()
.load(Customers.
class
,friendEmail);
FriendsId fid
=
new
FriendsId();
fid.setHost(host);
fid.setFriend(friend);
Friends f
=
new
Friends(fid);
HibernateUtil.getSession().saveOrUpdate(f);
HibernateUtil.commitTransaction();
}
catch
(HibernateException e)
{
throw
new
InfrastructureException(e);
}
}
注意不能 Host.getFriends().add(f);
因为f并不知道是谁加了它!
发表于 2005-04-28 14:00
黑灵
阅读(546)
评论(0)
编辑
收藏
所属分类:
ORM
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
Hibernate3中取得多层数据的所产生的n+1 selects问题的解决。
Hibernate3中的更新与删除
Could not initialize proxy - the owning Session was closed
iBatis实战小结!
一个困扰了我好几天的Hibernate+Spring的问题,算是解决了吧!
对于昨天User -- Friend关系的解决!
这样的表结构Hibernate映射应该是什么样子?
Hibernate用Mysql的中文问题
caveatemptor中的HibernateUtil
<
2005年4月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
公告
常用链接
我的随笔
我的评论
我的参与
最新评论
随笔分类
(175)
AJAX(6)
(rss)
DataBase(5)
(rss)
Do everything with Groovy(4)
(rss)
ExtJS
(rss)
J2EE(29)
(rss)
JSF(4)
(rss)
MStar Utility(2)
(rss)
ORM(9)
(rss)
RIA(3)
(rss)
Server配置(2)
(rss)
Struts(1)
(rss)
Tapestry(1)
(rss)
Unix&Linux(32)
(rss)
wap(1)
(rss)
WebWork(4)
(rss)
不编不知道,一编吓一跳(17)
(rss)
乱七八糟(32)
(rss)
客户端技术(1)
(rss)
正则表达式
(rss)
脚本语言(22)
(rss)
文章分类
(1)
Tomcat(1)
(rss)
博客同道
GENOW
(rss)
远离尘嚣
常用资源
Martin Fowler
Martin Fowler的文章
最新评论
1. re: 关于spring-mvc的InitBinder注解的参数
这个里面User与User_是两个不同的类
--mmocake