Hibernacija Vodič za bilješke mnogih do mnogih
1. Uvod
U ovom ćemo brzom vodiču na brzinu pogledati kako @ManyToMany napomena se može koristiti za specificiranje ove vrste odnosa u hibernaciji.
2. Tipičan primjer
Počnimo s jednostavnim dijagramom odnosa entiteta - koji pokazuje povezanost dva-prema-dva između dva entiteta zaposlenik i projekt:

U ovom scenariju bilo koji podatak zaposlenik može se dodijeliti više projekata i a projekt može imati više zaposlenika koji rade za to, što dovodi do povezanosti između mnogih.
Mi imamo zaposlenik stol sa zaposlenik_id kao svoj primarni ključ i a projekt stol sa id_projekta kao svoj primarni ključ. Stol za spajanje projekt_zaposlenika ovdje je potrebno za povezivanje obje strane.
3. Postavljanje baze podataka
Pretpostavimo da imamo već stvorenu bazu podataka s imenom proljeće_hibernirati_malo_do_mnogo.
Također trebamo stvoriti zaposlenik i projekt tablice zajedno s projekt_zaposlenika pridruži se stolu sa zaposlenik_id i projekt_id kao strani ključevi:
STVORI TABELU `zaposlenik` (` zaposlenik_id` int (11) NIJE NULL AUTO_INCREMENT, `first_name` varchar (50) DEFAULT NULL,` last_name` varchar (50) DEFAULT NULL, PRIMARY KEY (`worker_id`)) MOTOR = InnoDB AUTO_INCREMENT = 17 ZADATAK KARSETET = utf8; STVORI TABLU `project` (` project_id` int (11) NOT NULL AUTO_INCREMENT, `title` varchar (50) DEFAULT NULL, PRIMARY KEY (` project_id`)) ENGINE = InnoDB AUTO_INCREMENT = 18 DEFAULT CHARSET = utf8; STVORI TABLICU `worker_project` (` worker_id` int (11) NOT NULL, `project_id` int (11) NOT NULL, PRIMARY KEY (` worker_id`, `project_id`), KEY` project_id` (`project_id`), CONSTRAINT` worker_project_ibfk_1` STRANI KLJUČ (`zaposlenik_id`) LITERATURA` zaposlenik` (`zaposlenik_id`), OGRANIČENJE` zaposlenik_projekt_ibfk_2` STRANI KLJUČ (`projekt_id`) LITERATURA` projekt` (`projekt_id`)) ENGINE = IN8ARDET;
S postavljanjem baze podataka, sljedeći bi korak bio priprema Mavenovih ovisnosti i konfiguracije hibernacije. Za informacije o tome, pogledajte članak u Vodiču za hibernaciju4 s proljećem
4. Model klase
Model klase Zaposlenik i Projekt treba stvoriti s JPA bilješkama:
@Entity @Table (name = "Employee") Public class Employee {// ... @ManyToMany (cascade = {CascadeType.ALL}) @JoinTable (name = "Employee_Project", joinColumns = {@JoinColumn (name = "worker_id ")}, inverseJoinColumns = {@JoinColumn (name =" project_id ")}) Postavi projekte = novi HashSet (); // standardni konstruktor / getters / setters}
@Entity @Table (name = "Project") projekt javne klase {// ... @ManyToMany (mappedBy = "projects") private Set zaposlenici = new HashSet (); // standardni konstruktori / getteri / postavljači}
Kao što vidimo, oboje Zaposlenik razred i Projekt klase se odnose jedna na drugu, što znači da je povezanost među njima dvosmjerna.
Da bismo mapirali povezanost mnogo-prema-mnogima, koristimo @ManyToMany, @JoinTable i @JoinColumn bilješke. Pogledajmo ih izbliza.
The @ManyToMany anotacija se koristi u obje klase za stvaranje odnosa mnogi prema mnogima između entiteta.
Ova asocijacija ima dvije strane, tj. Vlasničku i inverznu stranu. U našem primjeru, strana posjedovanja je Zaposlenik pa je tablica spajanja navedena na strani koja posjeduje pomoću @JoinTable bilješka u Zaposlenik razred. The @JoinTable koristi se za definiranje tablice pridruživanja / povezivanja. U ovom slučaju jest Projekt zaposlenika.
The @JoinColumn napomena se koristi za specificiranje stupca pridruživanja / povezivanja s glavnom tablicom. Ovdje je stupac za pridruživanje zaposlenik_id i projekt_id je inverzni stupac spajanja od Projekt je na obrnutoj strani odnosa.
U Projekt razred, mapiranBy atribut se koristi u @ManyToMany napomena koja ukazuje na to da zaposlenici Zbirka je mapirana projekti kolekcija vlasničke strane.
5. Izvršenje
Kako bismo vidjeli bilješku mnogo-do-mnogo na djelu, možemo napisati sljedeći JUnit test:
javna klasa HibernateManyToManyAnnotationMainIntegrationTest {private static SessionFactory sessionFactory; privatna sjednica; // ... @Test javna praznina givenData_whenInsert_thenCreatesMtoMrelationship () {String [] workerData = {"Peter Oven", "Allan Norman"}; String [] projectData = {"IT projekt", "Projekt umrežavanja"}; Postavi projekte = novi HashSet (); za (String proj: projectData) {projects.add (novi Project (proj)); } for (String emp: workerData) {zaposlenik zaposlenik = novi zaposlenik (emp.split ("") [0], emp.split ("") [1]); assertEquals (0, worker.getProjects (). size ()); worker.setProjects (projekti); session.persist (zaposlenik); assertNotNull (zaposlenik); }} @Test javna praznina givenSession_whenRead_thenReturnsMtoMdata () {@SuppressWarnings ("neoznačeno") Popis workerList = session.createQuery ("FROM Employee") .list (); assertNotNull (liste zaposlenika); za (zaposlenika zaposlenika: workerList) {assertNotNull (worker.getProjects ()); }} // ...}
Možemo vidjeti odnos mnogo-prema-više između dva entiteta stvorena u bazi podataka: zaposlenik, projekt, i projekt_zaposlenika tablice s uzorcima podataka koji predstavljaju odnos.
6. Zaključak
U ovom uputstvu vidjeli smo kako stvoriti preslikavanja pomoću napomena mnogo-do-mnogo Hibernate-a, što je prikladniji primjerak u usporedbi sa stvaranjem XML datoteka za mapiranje.
Izvorni kod ovog vodiča možete pronaći na GitHubu.