JavaMuse

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

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 满山红叶 阅读(628) 评论(0)  编辑  收藏 所属分类: Hibernate学习笔记


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问