这两天学关联关系映射 
什么 OneToMany OneToOne ManyToMany ManyToOne 
什么 双向 单向 主键 外键 联合主键
什么 组件给我整的非常迷糊,不知道这关联关系映射到底是干什么用的,到底是什么?
怎么回事。学的模模糊糊的。 
今天终于有了一点小感悟,借此来总结一小下。关联关系映射首先从字面理解 
关联 指的是 对象和对象之间的关联 (比如 某个人属于某个班)。
关系 基于关系数据库的关系。关联关系映射指的就是 关联 和 关系之间的映射。也就是。我们如何把对象世界的关联 映射 到数据库中的关系之中(也就是表)想想一下,这样一个问题。
学生 和 班级 之间的关联。
在对象世界,我们想表示这种关系。可以在学生类里加一个班级对象。
这样,我就能通过学生找到他的班级了。那在数据库中呢?
数据库中我们可以在学生表或者班级表中某个表中加一个外键。
然后通过外键连接两个表。这样我们就能知道学生和班级之间的关系了。Hibernate 是ORMapping负责中间O到R的映射。我们通过Annotation或者XML进行配置。就能形成这种映射关系了。当我们想把对象存到数据库中的时候(并且设置了跟他关联的对象)。他就可以根据这种映射,正确的反应在数据库中。而当我们想把数据(关系) 读取到对象中的时候,他可以根据数据库中的数据  还有映射关系 把关联正确的反应在对象中。
简化思维。按照面向对象的思维创建好类。按照正确的方式创建好数据库中的表(参照Hibernate自动建表语句)。配置好映射关系。
小弟,刚学.理解的可能比较浅,可能有错误。
求高手耐心指导
不知道,自己大体上理解的正确吗?

解决方案 »

  1.   

    大体正确。写得不错。论思维的话,很少有不是OO思维的东西了,这东西提得太宽泛了。实体类在创建的时候,有些并不是原始的OO做法了,比方说 ID 属性。
    因为数据库中PK一样的记录,应该是同条记录,
    所以你必须覆盖实体类的hashCode方法和equals方法,使得 ID 属性值一样的对象 等效。这其实是数据库世界中的值匹配思维的体现。幸好OO的框架能容纳这种模拟而已。
      

  2.   


    初学,可能不太理解。我只知道如果主键属性是非基本数据类型的化。
    需要覆盖主键那个类的hashCode 和 equals方法 implements Serializable接口跟你说的
    所以你必须覆盖实体类的hashCode方法和equals方法,使得 ID 属性值一样的对象 等效。
    一样吗?
      

  3.   

    不一样。
    但只要是需要持久化到数据库中的对象都面临同样的局面,就是它们的对象句柄不再能用于区分对象,只能用值的不同(equeals与否)来区分对象。
      

  4.   

    为什么不是这样的呢?当他想知道两个实例(@Entity注解过的)对象是否相等时。他会找到对象的@Id属性对应的字段。
    比较Id属性对应的字段是否相等呢?这样只要重写Id属性对应字段的类的equals和hashCode不就OK了吗?
      

  5.   

    可以读一下Hibernate的source codes, 大体上就可以知道Hibernate是怎么工作的啦。
      

  6.   

    如果你没有重写POJO的equals和hashCode方法的话,Java默认是用==做equals比较动作的,这样数据库中是同一条记录的两个Java对象就不equals了。
      

  7.   

    感谢你的信任。
    昨天我仔细想了下,其实我5楼的说法还是有点欠缺的。Entity类的equals方法是需要改造,需要和数据库同一性挂钩,但是在ID属性上构建equals逻辑是不太好的,因为ID属性多数需要自增长,需要被Hibernate管理。
    所以最好在“业务键”(具有unique和not null约束的,通常是PK,但不应该是ID 的字段)上构建equals逻辑。具体参见此书:《Hibernate实战 2版》
      

  8.   

    那就是,还是要重写主键类的equals方法呗?非Entity类的equals方法?