双向@OneToMany / @ManyToOne关联
編程的目標之一是代表現實世界中的模型。 通常,應用程序需要對實體之間的某些關系進行建模。 在上一篇有關Hibernate關聯的文章中,我描述了建立“一對一”關系的規則。 今天,我將向您展示如何設置雙向的“ 一對多 ”和“ 多對一 ”關聯。 這個例子將基于以前的Hibernate教程 。
首先,我需要說我的代碼示例將基于一個簡單的情況。 讓我們想象一個足球聯賽。 每個聯賽都有球隊,并且在球隊中可以扮演一些球員。 因此,總結如下:一隊有很多球員,一個球員可以為一個隊效力。 通過這種方式,我們得到了明顯的“ 一對多 ”和“ 多對一 ”關系。
在此示例中,我將MySQL用作數據庫。 以下是用于創建表的腳本:
下一步是創建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是因為一個團隊可以擁有許多球員。 在下一個POJO中,關聯將為@ManyToOne,因為許多球員可以為一個團隊效力。
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();} ...代碼執行的結果是:
休眠:插入團隊(名稱)值(?)
休眠:插入玩家(姓氏,team_id)值(?,?)
休眠:插入玩家(姓氏,team_id)值(?,?)
就是這樣,在本教程中,我演示了如何設置“ 一對多 ”和“ 多對一 ”雙向關聯。 在同一個教程中,單向關聯的示例沒有任何意義。 因為Hibernate具有自己的最佳實踐:
單向關聯更難以查詢。 在大型應用程序中,查詢中的幾乎所有關聯都必須在兩個方向上都是可導航的。
參考: Fruzenshtein的筆記博客中來自我們的JCG合作伙伴 Alex Fruzenshtein的雙向@OneToMany / @ManyToOne協會 。
翻譯自: https://www.javacodegeeks.com/2013/03/bidirectional-onetomany-manytoone-association.html
總結
以上是生活随笔為你收集整理的双向@OneToMany / @ManyToOne关联的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓创始人是哪国人(安卓创始人)
- 下一篇: 寻找内存泄漏:一个案例研究