ORM中对象与数据库表之间的映射机制

时间:2021-01-12 21:38:22

1.实体类与数据库表一一映射

这是一种最简单的实现模式,即数据库表与对象一对一,即一个数据库表映射为一个Java对象。所有的表字段filed映射为Java对象的属性attribute。但是不同层次的实体类映射到数据表时,应根据数据库表的关系来进行。这样也有三种模式:

  • 一个类层次对应一个数据表
这里所说的一个类层次,指的是父类及其所有子类。将父类和子类中有持久性需求的属性设置为同一个数据表的字段。次方法实现起来简单,并且较好地支持多态。因为不同的子类可以用一个标签位加以区分。子类实例的转换比较容易实现,但是,类与数据库之间的耦合程度高。由于子类所特有的属性被所有类层次中的对象所共有,数据冗余字段较多。
  • 一个实体类对应一个数据表
各个子类所特有的属性,联合从父类中继承的公共属性,构成表的结构。父类不映射为数据库中的实体表,它只作为子类公共属性的载体。这种映射模型是的类属性值的保存和对象还原实现方便,缺点同样是类结构与数据库的耦合程度高,特别在父类属性变列时,所有从此继承下来的子类都要进行变更。此外,对多态支持也较差,子类的角色转换需要在子类对应的数据表之间准确地传递适当的属性值,同时需要富裕新的OID。这种情况下,就不如第一种映射模型,用同一个OID,在同一张表内可以实现不同子类之间的转换。
  • 一个类对应一个数据表
无论是父类还是子类,只要类中的属性持久性保存的需要,就将类映射到数据表。子类的表以父类表的OID为外键。在关系数据库中最大程度地实现了类的多态性。与前两者比较,对象与数据库的耦合程度是最低的,某一个类属性的变更引起的表结构的变动最少。这种方法的缺点在于生成子类实例时,继承层次多的子类的属性值还原很难。由于子类的公共属性包含在父类对用的数据表中,当需要单独获取子类实例时,需要从多个数据表中获取数据合成完整的实例。当类的层次较多时,子类的访问可能会成为系统与数据库交互的瓶颈。
2.类属性与数据库的数据表与列建立一种随机的映射关系
一个类属性可以对应1或多个实体表的字段。同样,一个实体表可以对应1个或多个实体类的属性。这种实现模式主要还是根据业务逻辑来划分对象的。