三、实体之间的关系
就像现实世界中一样,你的持久化对象不是单独存在的。实体类通常会和其它的类交互,要么为它的类提供服务或者使用其它类的服务。类和其它的类可以是一对一的,一对多的,多对一的,或者多对多的关系。你能在本文的棒球运动员和棒球队例子中,找到这些关系。
举个例子,一个 Player又有一个击球率。击球率和该运动员就是一对一的关系。一个 Player有一个击球率。这个击球率只属于某一个 Player。
一个Team有许多的 Player。虽然个别的 Player只属于一个单独的Team,一个Team包括许多的 Player。Team类和Player类之间的俄关系就是一对多的关系。一个Team有许多的 Player。另外一个类似的例子就是多对一的关系。多对一的关系通常是将一对多的关系反过来看。举个例子,如果你你从一个 Player的角度考虑他和Team之间的关系,我们很清楚的说 Player 和 Team是多对一的关系。
http://www.qqread.com/java/2007/11/w381044.html 
图一:多个球员对一个球队的关系
一个Team在每一个赛季打了很多的比赛,同时每个比赛有很多的Team来参加。从关系数据库的角度来说,Team和比赛就是多对多的关系。
通过持久化API,你可以模拟这些实体的关系。如果每次你的实体对象有这些关系的时候,你就可以在相关的实体中应用其中的一种声明:
1. OneToOne
2. OneToMany
3. ManyToOne
4. ManyToMany
4. ManyToMany
数据库关系可以是单方向的,意思说只有一个实体知道与其它实体之间的关系。单向的关系就存在“主”方,“主”方保留数据库中的关系信息。
双向关系同时有”主”方和”反”方。“主”方决定如何,什么时候来更新实体间的关系。同时,”主”方中也包含了相对其它实体来说的外键。
回到棒球的例子, Player对象和Team对象有多对一的关系。虽然现在显示的世界中来说不合理,但是在数据库中, Player确是关系的决定者。在 Player类中将 team属性增加为 ManyToOne声明,就完成了 Player 和 Team实体间多对一的关系,代码如下:
@Entity public class Player implements Serializable { ... private Team team; @ManyToOne public Team getTeam() { return team; } ... }
既然 Team 和 Player 类存在一个双向的关系,那么你必须也要在“反”方定义这个关系,与“正”方相对应。从 Team这个类的角度出发,它们之间的关系是一对多的。另外, Player实例通过 其team变量来访问 Team实例。在一对多的关系中使用 mappedBy映射属性,持久化引擎会知道如何匹配players和 teams。在双向关系中, mappedBy映射属性存在于”反”方,即使Team实体。在这个例子中, mappedBy映射属性显示了一个 Player事例的 team属性映射到一个 Team事例。映射 Player对象的 team属性就是意味着 Team对象的标识号将在 PLAYER表中作为一个外键,单独成为一列。
Team实体类将会立即在下面显示。注意getPlayers方法,被 OneToMany声明,并且是 mappedBy属性。
@Entity public class Team implements Serializable { private Long id; private String teamName; private String division; private Collection<Player> players; /** Creates a new instance of Team */ public Team() { players = new HashSet(); } /** * Gets the id of this Team. * @return the id */ @Id @GeneratedValue public Long getId() { return this.id; } /** * Sets the id of this Team to the specified value. * @param id the new id */ public void setId(Long id) { this.id = id; } @OneToMany(mappedBy = "team") public Collection<Player> getPlayers() { return players; } public void setPlayers(Collection<Player> players) { this.players = players; } ... }
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- Java环境安装配置 (5668篇文章)
- Java编程开发手册 (8321篇文章)
- Wlan组网----家庭专题 (4217篇文章)
- Java API (108篇文章)
- Java基础开发篇 (583篇文章)
- 精通Hibernate之映射继承关系(四) (0次浏览)
- 何不将Java与.NET合二为一? (0次浏览)
- Hibernate的JNDI名称绑定分析 (0次浏览)
- 精通Hibernate之映射继承关系(一) (0次浏览)
- 精通Hibernate之映射继承关系(二) (0次浏览)
- 美国计算机教授语出惊人:Java对学生有害 (0次浏览)
- JDK 6 JRE 6 Update 4 (0次浏览)
- 三步教你改善Java代码质量 (0次浏览)
- Java语言入门 简述Java语言回收机制 (0次浏览)
- 2008年Java开发者最迫切的五个期望 (0次浏览)



