当前位置: 首页 > 图文教程 > Java技术 > 数据库持久层 > 数据库持久层:Hibernate中与关联有关的问题
面向对象的语言使用对象引用和对象引用的集合表示关联。在关系世界里,关联被表示
为外键列,外键是几个表的键值的拷贝。这两种表示之间有些微妙的不同。
对象引用具有固有的方向性,关联是指从一个对象到另一个对象的引用。如果对象间的
关联可以在两个方向上进行导航,你需要定义两次关联,在每个关联类上分别定义一次。
public class User {
private Set billingDetails;
...
}
public class BillingDetails {
private User user;
...
}
另一方面,外键并不通过固有的方向性进行关联。事实上,对关系数据模型来说导航没
有任何意义,因为你可以通过表连接和投射创建任意的数据关联。
实际上,只看Java类不可能确定单向关联的多重度。Java关联可以具有多对多的多重度。
例如,我们的对象模型可能有看起来像这样的:
public class User {
private Set billingDetails;
...
}
public class BillingDetails {
private Set users;
...
}
另一方面,表关联总是一对多或是一对一的。通过查看外键的定义你可以立刻知道多重
度。下面是一个一对多的关联(或者,从另一个方向看,是多对一的):
USER_ID BIGINT FOREIGN KEY REFERENCES USER
这些是一对一的关联:
USER_ID BIGINT UNIQUE FOREIGN KEY REFERENCES USER
BILLING_DETAILS_ID BIGINT PRIMARY KEY FOREIGN KEY REFERENCES USER
如果你希望在关系数据库中表示一个多对多的关联,你必须引入一个新表,称为连接表。
这个表不会在对象模型中的任何地方出现。对我们的例子来说,如果我们认为用户和用户的
帐单信息之间为多对多的关系,连接表可以如下定义:
CREATE TABLE USER_BILLING_DETAILS (
USER_ID BIGINT FOREIGN KEY REFERENCES USER,
BILLING_DETAILS_ID BIGINT FOREIGN KEY REFERENCES BILLING_DETAILS
PRIMARY KEY (USER_ID, BILLING_DETAILS_ID)
)
评论 (0) All