ORM 的原则是将一个类映射到一张表上,然而对象和关系型数据库之间有一点的差异。
对象和对象之间的关系有一对一,一对多,多对多。这三个关系的关系的存储是有差异的。
1、一对一:我们可以用两张表分别表示两个类。他们之间的关系我们可以用主关键字或者外关键字来表示。然而这里有一个粒度的问题(The problem of granularity )。关于粒度问题见第4点。
2、一对多:我们也可以用两张表来表示两个类。他们的关系我们可以用外键来关联。
3、多对多:我们可以用两张表来表示这两个类。用第三张表来表示他们之间的关系。
4、关于问题的粒度:
如:一个用户和一个地址之间的关系。当然我们可以用一对一的方法来解决。
然而这样是否合理?也许最好的方法是在数据库中增加一个新的数据类型Address(country state city zipcode etc.)。这样我们就很容易把这个粒度问题解决了。不幸的是,数据库是不允许自定义类型的(也许现在的数据库可以,鄙人不太清楚,呵呵)。Hibernate 对这个问题有了很好的解决。见以后的文章。
5、对象之间可以有继承的关系,这是数据库望洋兴叹的。Hibernate 对这个问题有了很好的解决。见以后的文章。
6、对象的身份识别问题。
大家都知道,java中的对象识别是用equals()和haseCode()来实现。
举例:
package
jmuse.eg;
/** */
/**
*@hibernate.class table="MESSAGE"
*
*/
public
class
Message
{
private
Long id;
private
String text;
private
String string;
public
void
setString(String s)
{
string
=
s;
}
/** */
/**
*@hibernate.property
*
*/
public
String getString()
{
return
this
.string;
}
private
Message nextMessage;
public
Message()
{}
public
Message(String text)
{
this
.text
=
text;
}
public
void
setId(Long id)
{
this
.id
=
id;
}
public
void
setText(String text)
{
this
.text
=
text;
}
public
void
setNextMessage(Message nextMessage)
{
this
.nextMessage
=
nextMessage;
}
/** */
/**
*@hibernate.id column="MESSAGE_ID" generator-class="native"
*
*/
public
Long getId()
{
return
(
this
.id);
}
/** */
/**
*@hibernate.property column="MESSAGE_TEXT"
*
*/
public
String getText()
{
return
(
this
.text);
}
/** */
/**
*@hibernate.many-to-one column="NEXT_MESSAGE_ID" cascade="all"
*
*/
public
Message getNextMessage()
{
return
(
this
.nextMessage);
}
}
这样的类由于没有实现equals()和haseCode(),所以如果用下面的代码我们可以看到如下输出:
Message m1
=
new
Message("Hello");
Message m2
=
new
Message("Hello");
if
(!(m2.equals(m1))
)log.info(
"
m1 and m2 are not idential
"
);
else
log.info(
"
m1 and m2 are identical
"
);
//
/out put
//
m1 and m2 are not idential
但是我们加上如下代码:
public
boolean
equals(Object o)
{
if
(
this
==
o)
return
true
;
if
(
!
(o
instanceof
Message))
return
false
;
final
Message m
=
(Message)o;
return
this
.getText().equals(m.getText());
}
public
int
hashCode()
{
//
return text==null?System.identityHashCode(this):text.hashCode();
int
hase
=
20
;
return
20
*
hase
+
getText().hashCode();
}
out put
/
m1 and m2 are identical
这就是java的对象识别。如果你将修改后的Message对象加入到java.util.Set中,不管你加多少,最后size()仍然为1。
那么hibernate中的对象识别如何呢?见以后文章。呵呵。
posted on 2007-02-10 14:44 满山红叶 阅读(380) 评论(0) 编辑 收藏 所属分类: Hibernate学习笔记