双向@OneToMany / @ManyToOne关联
編程的目標(biāo)之一是代表現(xiàn)實世界中的模型。 通常,應(yīng)用程序需要對實體之間的某些關(guān)系進(jìn)行建模。 在上一篇有關(guān)Hibernate關(guān)聯(lián)的文章中,我描述了建立“一對一”關(guān)系的規(guī)則。 今天,我將向您展示如何設(shè)置雙向的“ 一對多 ”和“ 多對一 ”關(guān)聯(lián)。 這個例子將基于以前的Hibernate教程 。
首先,我需要說我的代碼示例將基于一個簡單的情況。 讓我們想象一個足球聯(lián)賽。 每個聯(lián)賽都有球隊,并且在球隊中可以扮演一些球員。 因此,總結(jié)如下:一隊有很多球員,一個球員可以為一個隊效力。 通過這種方式,我們得到了明顯的“ 一對多 ”和“ 多對一 ”關(guān)系。
在此示例中,我將MySQL用作數(shù)據(jù)庫。 以下是用于創(chuàng)建表的腳本:
下一步是創(chuàng)建POJO:
import java.util.Set;import javax.persistence.*;@Entity @Table(name = 'teams') public class Team {@Id@GeneratedValueprivate Integer id;private String name;@OneToMany(mappedBy='team', cascade=CascadeType.ALL)private Setplayers;public Team(String name) {this.name = name;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public SetgetPlayers() {return players;}public void setPlayers(Setplayers) {this.players = players;} }我使用@OneToMany是因為一個團(tuán)隊可以擁有許多球員。 在下一個POJO中,關(guān)聯(lián)將為@ManyToOne,因為許多球員可以為一個團(tuán)隊效力。
import javax.persistence.*;@Entity @Table(name = 'players') public class Player {@Id@GeneratedValueprivate Integer id;private String lastname;@ManyToOne@JoinColumn(name = 'team_id')private Team team;public Player(String lastname) {this.lastname = lastname;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getLastname() {return lastname;}public void setLastname(String lastname) {this.lastname = lastname;}public Team getTeam() {return team;}public void setTeam(Team team) {this.team = team;} }在這里,我指定將從擁有方( Teams )連接的列( team_id )。 注意,我沒有在POJO中聲明team_id字段。 如果我需要為球員更換球隊,我只需要使用setTeam(Team team) setter。
聲明POJO之后,我可以演示如何持久化它們:
...public static void main(String[] args) {SessionFactory sessionFactory = HibernateUtil.getSessionFactory();Session session = sessionFactory.openSession();session.beginTransaction();Team team = new Team('Barcelona');Setplayers = new HashSet();Player p1 = new Player('Messi');Player p2 = new Player('Xavi');p1.setTeam(team);p2.setTeam(team);players.add(p1);players.add(p2);team.setPlayers(players);session.save(team);session.getTransaction().commit();session.close();} ...代碼執(zhí)行的結(jié)果是:
休眠:插入團(tuán)隊(名稱)值(?)
休眠:插入玩家(姓氏,team_id)值(?,?)
休眠:插入玩家(姓氏,team_id)值(?,?)
就是這樣,在本教程中,我演示了如何設(shè)置“ 一對多 ”和“ 多對一 ”雙向關(guān)聯(lián)。 在同一個教程中,單向關(guān)聯(lián)的示例沒有任何意義。 因為Hibernate具有自己的最佳實踐:
單向關(guān)聯(lián)更難以查詢。 在大型應(yīng)用程序中,查詢中的幾乎所有關(guān)聯(lián)都必須在兩個方向上都是可導(dǎo)航的。
參考: Fruzenshtein的筆記博客中來自我們的JCG合作伙伴 Alex Fruzenshtein的雙向@OneToMany / @ManyToOne協(xié)會 。
翻譯自: https://www.javacodegeeks.com/2013/03/bidirectional-onetomany-manytoone-association.html
總結(jié)
以上是生活随笔為你收集整理的双向@OneToMany / @ManyToOne关联的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓创始人是哪国人(安卓创始人)
- 下一篇: 安卓版陌陌恢复大师(安卓版陌陌)