数据库数据 java对象_对象的存储和关系型数据库

ORM 的原则是将一个类映射到一张表上,然而对象和关系型数据库之间有一点的差异。

对象和对象之间的关系有一对一,一对多,多对多。这三个关系的关系的存储是有差异的。

1、一对一:我们可以用两张表分别表示两个类。他们之间的关系我们可以用主关键字或者外关键字来表示。然而这里有一个粒度的问题(The problem of granularity )。关于粒度问题见第4点。

2、一对多:我们也可以用两张表来表示两个类。他们的关系我们可以用外键来关联。

3、多对多:我们可以用两张表来表示这两个类。用第三张表来表示他们之间的关系。

4、关于问题的粒度:

如:一个用户和一个地址之间的关系。当然我们可以用一对一的方法来解决。

然而这样是否合理?也许最好的方法是在数据库中增加一个新的数据类型Address(country state city zipcode etc.)。这样我们就很容易把这个粒度问题解决了。不幸的是,数据库是不允许自定义类型的(也许现在的数据库可以,鄙人不太清楚,呵呵)。Hibernate 对这个问题有了很好的解决。见以后的文章。

5、对象之间可以有继承的关系,这是数据库望洋兴叹的。Hibernate 对这个问题有了很好的解决。见以后的文章。

6、对象的身份识别问题。

大家都知道,java中的对象识别是用equals()和haseCode()来实现。

举例:

4f1150b881333f12a311ae9ef34da474.png

package

jmuse.eg;

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

/** */

/**

d18c02628675d0a2c816449d98bda930.png *@hibernate.class table="MESSAGE"

d18c02628675d0a2c816449d98bda930.png *

8f1ba5b45633e9678d1db480c16cae3f.png

*/

4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

public

class

Message

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

private

Long id;

d18c02628675d0a2c816449d98bda930.png

private

String text;

d18c02628675d0a2c816449d98bda930.png

private

String string;

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

public

void

setString(String s)

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png        string

=

s;

ecedf933ec37d714bd4c2545da43add2.png    }

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

/** */

/**

d18c02628675d0a2c816449d98bda930.png     *@hibernate.property 

d18c02628675d0a2c816449d98bda930.png     *

ecedf933ec37d714bd4c2545da43add2.png

*/

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

public

String getString()

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

return

this

.string;

ecedf933ec37d714bd4c2545da43add2.png    }

d18c02628675d0a2c816449d98bda930.png    

d18c02628675d0a2c816449d98bda930.png

private

Message nextMessage;

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

public

Message()

9b8a8a44dd1c74ae49c20a7cd451974e.png

{}

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

public

Message(String text)

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

this

.text

=

text;

ecedf933ec37d714bd4c2545da43add2.png    }

d18c02628675d0a2c816449d98bda930.png    

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

public

void

setId(Long id)

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

this

.id

=

id;

ecedf933ec37d714bd4c2545da43add2.png    }

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

public

void

setText(String text)

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

this

.text

=

text;

ecedf933ec37d714bd4c2545da43add2.png    }

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

public

void

setNextMessage(Message nextMessage)

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

this

.nextMessage

=

nextMessage;

ecedf933ec37d714bd4c2545da43add2.png    }

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

/** */

/**

d18c02628675d0a2c816449d98bda930.png     *@hibernate.id column="MESSAGE_ID" generator-class="native"

d18c02628675d0a2c816449d98bda930.png     *

ecedf933ec37d714bd4c2545da43add2.png

*/

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

public

Long getId()

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

return

(

this

.id);

ecedf933ec37d714bd4c2545da43add2.png    }

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

/** */

/**

d18c02628675d0a2c816449d98bda930.png     *@hibernate.property column="MESSAGE_TEXT"

d18c02628675d0a2c816449d98bda930.png     *

ecedf933ec37d714bd4c2545da43add2.png

*/

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

public

String getText()

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

return

(

this

.text);

ecedf933ec37d714bd4c2545da43add2.png    }

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

/** */

/**

d18c02628675d0a2c816449d98bda930.png     *@hibernate.many-to-one column="NEXT_MESSAGE_ID" cascade="all"

d18c02628675d0a2c816449d98bda930.png     *

ecedf933ec37d714bd4c2545da43add2.png

*/

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

public

Message getNextMessage()

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

return

(

this

.nextMessage);

ecedf933ec37d714bd4c2545da43add2.png    }

8f1ba5b45633e9678d1db480c16cae3f.png}

这样的类由于没有实现equals()和haseCode(),所以如果用下面的代码我们可以看到如下输出:

4f1150b881333f12a311ae9ef34da474.png

Message m1

=

new

Message("Hello");

4f1150b881333f12a311ae9ef34da474.pngMessage m2

=

new

Message("Hello");

4f1150b881333f12a311ae9ef34da474.png

if

(!(m2.equals(m1))

)log.info(

"

m1 and m2 are not idential

"

);

4f1150b881333f12a311ae9ef34da474.png

else

log.info(

"

m1 and m2 are identical

"

);

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

//

/out put

//

4f1150b881333f12a311ae9ef34da474.png

m1 and m2 are not idential

但是我们加上如下代码:

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

public

boolean

equals(Object o)

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

if

(

this

==

o)

return

true

;

d18c02628675d0a2c816449d98bda930.png

if

(

!

(o

instanceof

Message))

d18c02628675d0a2c816449d98bda930.png

return

false

;

d18c02628675d0a2c816449d98bda930.png

final

Message m

=

(Message)o;

d18c02628675d0a2c816449d98bda930.png

return

this

.getText().equals(m.getText());

8f1ba5b45633e9678d1db480c16cae3f.png    }

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

public

int

hashCode()

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

//

return text==null?System.identityHashCode(this):text.hashCode();

d18c02628675d0a2c816449d98bda930.png

int

hase

=

20

;

d18c02628675d0a2c816449d98bda930.png        

d18c02628675d0a2c816449d98bda930.png

return

20

*

hase

+

getText().hashCode();

8f1ba5b45633e9678d1db480c16cae3f.png    }

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

out put

/

4f1150b881333f12a311ae9ef34da474.png

m1 and m2 are identical

这就是java的对象识别。如果你将修改后的Message对象加入到java.util.Set中,不管你加多少,最后size()仍然为1。

那么hibernate中的对象识别如何呢?见以后文章。呵呵。

posted on 2007-02-10 14:44 满山红叶 阅读(380) 评论(0)  编辑  收藏 所属分类: Hibernate学习笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值