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.