Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilMaxim Hruda
1
Association table mapping Jakub Chalupa Naim Ashhab ČVUT FEL A7B36ASS – Architektura SW systémů LS 2014
2
Association table mapping – úvod Problém objekty jsou mezi sebou provázány referencemi každý objekt udržuje kolekci referencí na jiné objekty Příklad: zaměstnanci a jejich zkušenosti každý zaměstnanec má více zkušeností každá zkušenost může být připárována k více zaměstnancům Jak na to? v relační databázi vytvoříme asociační tabulku, která nám zaznamená jednotlivé reference mezi entitami
3
Association table mapping – schéma Transformace relací mezi objekty do relační databáze zaměstnanec vlastní kolekci zkušeností zkušenost vlastní kolekci zaměstnanců, které tuto zkušenost mají každá jednotlivá vazba bude reprezentována řádkem v asociační tabulce
4
Association table mapping - implementace Zaměstnanci a zkušenosti zaměstnanec má kolekci zkušeností, zkušenost má kolekci zaměstnanců class Employee... { private List skills; public List getSkills() { return skills; } public void setSkills(List skill) { this.skills= skills; } public void addSkill(Skill skill) { if(!skills.contains(skill)) { skills.add(skill); } public void removeSkill(Skill skill) { skills.remove(skill); } class Skill... { private List employees; public List getEmployees() { return employees; } public void setEmployees(List employees) { this.employees = employees; } public void addEmployee(Employee employee) { if(!employees.contains(employee)) { employees.add(employee); } public void removeEmployee(Employee employee) { employees.remove(employee); }
5
Association table mapping – spojovací tabulka kdo managuje spojovací tabulku? class EmployeeMapper... { private List loadSkills(Employee emp) { List skills = new ArrayList (); for(DataRow row : skillLinkTable.getRows("employeeId = ?", emp.id)) { skills.add(Skill.find("id", row.id)); } return skills; } private void saveSkills(Employee emp) { deleteSkills(emp); for(Skill s : emp.skills) { DataRow row = skillLinkTable.newRow(); row.employeeId = emp.id; row.skillId = s.id; skillLinkTable.addRow(row); } private void deleteSkills(Employee emp) { for(DataRow row : skillLinkTable.getRows("employeeId = ?", emp.id)) { row.delete(); }.... }
6
Association table mapping – zmeny v referencích Problémy co se stane při změně jedné kolekce? musíme zajistit update druhé kolekce např. celým novým načtením z databáze co se stane při odstranění jedné položky z kolekce? co se stane při přidání položky do jedné kolekce? Odpověď rozumná ORM řeší všechny tyto nepříjemnosti na pozadí
7
Association table mapping – pouzití ORM všude u relací *.. * JPA (Hibernate): class Employee... { private Set skills;... @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinTable(name = "employee_skills", joinColumns = { @JoinColumn(name = "employee_id", nullable = false, updatable = false)}, @InverseJoinColumns = {@JoinColumn(name = "skill_id", nullable = false, updatable = false)} ) public Set getSkills() { return skills; }... class Skill... { private Set employees;... @ManyToMany(fetch = FetchType.LAZY, mappedBy = "skills") public Set getEmployees() { return employees; }...
8
Association table mapping – shrnutí Výhody převedení n..n relace mezi objekty do relační databáze Nevýhody složitá údržba spojovací tabulky a jednotlivých kolekcí při změně jedné kolekce nutnost změny druhé kolekce Související vzory dependent mapping
9
Zdroje Martin Fowler - Catalog of Patterns of Enterprise Application Architecture (http://martinfowler.com/eaaCatalog/) Jimmy Nilsson – Applying domain-driven design and patterns: with examples in C# and.NET http://www.mkyong.com/hibernate/hibernate-many-to-many-relationship-example-annotation/
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.