· 5 years ago · Apr 17, 2020, 07:24 PM
1# Hibernate
2
3[GitHub - pperezp/test-hibernate-maven: Project with maven and hibernate](https://github.com/pperezp/test-hibernate-maven.git)
4
5## 1.- Creación de proyecto maven
6```shell
7mvn -B archetype:generate \
8 -DarchetypeGroupId=org.apache.maven.archetypes \
9 -DgroupId=cl.prez.hibernate \
10 -DartifactId=test-hibernate-mvn
11```
12
13### pom.xml
14```xml
15<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
16 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
17 <modelVersion>4.0.0</modelVersion>
18 <groupId>cl.prez.hibernate</groupId>
19 <artifactId>testHibernateMvn</artifactId>
20 <packaging>jar</packaging>
21 <version>1.0-SNAPSHOT</version>
22 <name>testHibernateMvn</name>
23 <url>http://maven.apache.org</url>
24
25 <dependencies>
26 <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
27 <dependency>
28 <groupId>org.projectlombok</groupId>
29 <artifactId>lombok</artifactId>
30 <version>1.18.12</version>
31 <scope>provided</scope>
32 </dependency>
33
34 <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
35 <dependency>
36 <groupId>org.hibernate</groupId>
37 <artifactId>hibernate-core</artifactId>
38 <version>5.4.14.Final</version>
39 </dependency>
40
41 <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
42 <dependency>
43 <groupId>mysql</groupId>
44 <artifactId>mysql-connector-java</artifactId>
45 <version>5.1.48</version>
46 </dependency>
47 </dependencies>
48
49 <!-- Build JAR with dependencies-->
50 <build>
51 <plugins>
52 <plugin>
53 <artifactId>maven-assembly-plugin</artifactId>
54 <configuration>
55 <archive>
56 <manifest>
57 <mainClass>cl.prez.hibernate.App</mainClass>
58 </manifest>
59 </archive>
60 <descriptorRefs>
61 <descriptorRef>jar-with-dependencies</descriptorRef>
62 </descriptorRefs>
63 </configuration>
64 </plugin>
65 </plugins>
66 </build>
67
68 <!-- JDK 1.8 -->
69 <properties>
70 <maven.compiler.target>1.8</maven.compiler.target>
71 <maven.compiler.source>1.8</maven.compiler.source>
72 </properties>
73</project>
74
75```
76
77## 2.- Base de datos
78```mysql
79CREATE DATABASE IF NOT EXISTS test;
80
81USE test;
82
83CREATE TABLE style(
84 style_id INTEGER AUTO_INCREMENT,
85 style_name VARCHAR(100),
86 PRIMARY KEY(style_id)
87);
88
89INSERT INTO
90 style(style_name)
91VALUES
92 ('Heavy metal'),
93 ('Trash metal'),
94 ('Speed metal'),
95 ('Death metal'),
96 ('Brutal death metal'),
97 ('Metal extremo'),
98 ('Djent'),
99 ('Groove metal'),
100 ('Death metal técnico'),
101 ('Death metal progresivo'),
102 ('Death metal melódico'),
103 ('Power metal');
104
105CREATE TABLE country(
106 country_id INTEGER AUTO_INCREMENT,
107 country_name VARCHAR(100),
108 PRIMARY KEY(country_id)
109);
110
111INSERT INTO
112 country(country_name)
113VALUES
114 ('Estados Unidos'),
115 ('Suecia'),
116 ('Chile'),
117 ('Finlandia');
118
119CREATE TABLE band(
120 band_id INTEGER AUTO_INCREMENT,
121 band_name VARCHAR(100),
122 country_id INTEGER,
123 band_year INTEGER,
124 PRIMARY KEY(band_id),
125 FOREIGN KEY(country_id) REFERENCES country(country_id)
126);
127
128INSERT INTO
129 band(band_name, country_id, band_year)
130VALUES
131 ('Metallica', 1, 1981),
132 ('Cannibal Corpse', 1, 1988),
133 ('Deicide', 1, 1987),
134 ('Meshuggah', 2, 1987),
135 ('Criminal', 3, 1991),
136 ('Death', 1, 1983),
137 ('Children of bodom', 4, 1997);
138
139CREATE TABLE band_style(
140 band_id INTEGER,
141 style_id INTEGER,
142 FOREIGN KEY(band_id) REFERENCES band(band_id),
143 FOREIGN KEY(style_id) REFERENCES style(style_id)
144);
145
146INSERT INTO
147 band_style(band_id, style_id)
148VALUES
149 (1,1), (1,2), (1,3),
150 (2,4), (2,5),
151 (3,4),
152 (4,6), (4,7),
153 (5,2), (5,4), (5,8),
154 (6,4), (6,9), (6,10),
155 (7,11), (7,12);
156
157
158SELECT * FROM style;
159SELECT * FROM country;
160SELECT * FROM band;
161SELECT * FROM band_style;
162
163-- 1.- Listado de bandas y su información
164SELECT
165 band.band_id 'Band ID',
166 band.band_name 'Band',
167 GROUP_CONCAT(style.style_name) 'Styles',
168 country.country_name 'Country',
169 band.band_year 'Year'
170FROM
171 band
172 LEFT JOIN country ON country.country_id = band.country_id
173 LEFT JOIN band_style ON band_style.band_id = band.band_id
174 LEFT JOIN style ON style.style_id = band_style.style_id
175GROUP BY
176 band.band_id
177ORDER BY
178 band_name;
179```
180
181## 3.- resources/META-INF/persistence.xml
182```xml
183<?xml version="1.0" encoding="UTF-8" ?>
184<persistence
185 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
186 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
187 version="2.0"
188 xmlns="http://java.sun.com/xml/ns/persistence">
189
190 <persistence-unit name="persistence-unit">
191 <properties>
192 <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
193 <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test" />
194 <property name="javax.persistence.jdbc.user" value="root" />
195 <property name="javax.persistence.jdbc.password" value="123456" />
196 <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
197 <property name="hibernate.show_sql" value="false" />
198 </properties>
199 </persistence-unit>
200</persistence>
201```
202
203## 4.- Clases modelo (Entities)
204
205### model/Style.java
206```java
207package cl.prez.hibernate.model;
208
209import javax.persistence.Column;
210import javax.persistence.Entity;
211import javax.persistence.GeneratedValue;
212import javax.persistence.GenerationType;
213import javax.persistence.Id;
214import javax.persistence.Table;
215
216import lombok.Data;
217
218@Data
219@Entity
220@Table(name = "style")
221public class Style {
222 @Id
223 @GeneratedValue(strategy = GenerationType.IDENTITY)
224 @Column(name = "style_id")
225 private Integer id;
226
227 @Column(name = "style_name")
228 private String name;
229}
230```
231
232### model/Country.java
233```java
234package cl.prez.hibernate.model;
235
236import javax.persistence.Column;
237import javax.persistence.Entity;
238import javax.persistence.GeneratedValue;
239import javax.persistence.GenerationType;
240import javax.persistence.Id;
241import javax.persistence.Table;
242
243import lombok.Data;
244
245@Data
246@Entity
247@Table(name = "country")
248public class Country {
249 @Id
250 @GeneratedValue(strategy = GenerationType.IDENTITY)
251 @Column(name = "country_id")
252 private Integer id;
253
254 @Column(name = "country_name")
255 private String name;
256}
257```
258
259### model/dto/BandDTO.java
260Esta clase es para ejecutar el select "Listado de bandas y su información"
261```java
262package cl.prez.hibernate.model.dto;
263
264import lombok.AllArgsConstructor;
265import lombok.Data;
266
267@Data
268@AllArgsConstructor
269public class BandDTO {
270 private Integer id;
271 private String name;
272 private String styles;
273 private String country;
274 private Integer year;
275}
276```
277
278### model/Band.java
279```java
280package cl.prez.hibernate.model;
281
282import java.util.List;
283
284import javax.persistence.Column;
285import javax.persistence.Entity;
286import javax.persistence.GeneratedValue;
287import javax.persistence.GenerationType;
288import javax.persistence.Id;
289import javax.persistence.JoinColumn;
290import javax.persistence.JoinTable;
291import javax.persistence.ManyToMany;
292import javax.persistence.ManyToOne;
293import javax.persistence.NamedNativeQuery;
294import javax.persistence.NamedNativeQueries;
295import javax.persistence.Table;
296import javax.persistence.SqlResultSetMapping;
297import javax.persistence.ConstructorResult;
298import javax.persistence.ColumnResult;
299
300import cl.prez.hibernate.model.dto.BandDTO;
301
302import lombok.Data;
303
304@NamedNativeQueries({
305 @NamedNativeQuery(
306 name = "getInfoBands",
307 query = "SELECT"+
308 " band.band_id 'band_id',"+
309 " band.band_name 'band_name',"+
310 " GROUP_CONCAT(style.style_name) 'band_styles',"+
311 " country.country_name 'band_country',"+
312 " band.band_year 'band_year' "+
313 "FROM"+
314 " band"+
315 " LEFT JOIN country ON country.country_id = band.country_id"+
316 " LEFT JOIN band_style ON band_style.band_id = band.band_id"+
317 " LEFT JOIN style ON style.style_id = band_style.style_id "+
318 "GROUP BY"+
319 " band.band_id "+
320 "ORDER BY"+
321 " band_name",
322 resultSetMapping = "getInfoBandsMapping"
323 )
324})
325
326@SqlResultSetMapping(
327 name = "getInfoBandsMapping",
328 classes = @ConstructorResult(
329 targetClass = BandDTO.class,
330 columns = {
331 @ColumnResult(name = "band_id"),
332 @ColumnResult(name = "band_name"),
333 @ColumnResult(name = "band_styles"),
334 @ColumnResult(name = "band_country"),
335 @ColumnResult(name = "band_year")
336 }
337 )
338)
339
340@Data
341@Entity
342@Table(name = "band")
343public class Band {
344 @Id
345 @GeneratedValue(strategy = GenerationType.IDENTITY)
346 @Column(name = "band_id")
347 private Integer id;
348
349 @Column(name = "band_name")
350 private String name;
351
352 @ManyToOne
353 @JoinColumn(name = "country_id")
354 private Country country;
355
356 @ManyToMany
357 @JoinTable(
358 name = "band_style",
359 joinColumns = @JoinColumn(name = "band_id"),
360 inverseJoinColumns = @JoinColumn(name = "style_id")
361 )
362 private List<Style> styles;
363
364 @Column(name = "band_year")
365 private Integer year;
366}
367```
368## 5.- Clase principal
369### App.java
370```java
371package cl.prez.hibernate;
372
373import java.util.List;
374
375import javax.persistence.EntityManager;
376import javax.persistence.EntityManagerFactory;
377import javax.persistence.Persistence;
378import javax.persistence.Query;
379
380import cl.prez.hibernate.model.Band;
381import cl.prez.hibernate.model.dto.BandDTO;
382
383public class App {
384 public static void main( String[] args ){
385 // Name in persistence.xml
386 final String PERSISTENCE_NAME = "persistence-unit";
387
388 EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(PERSISTENCE_NAME);
389 EntityManager entityManager = entityManagerFactory.createEntityManager();
390
391 Query query = entityManager.createQuery("FROM Band", Band.class);
392 List<Band> bands = query.getResultList();
393
394 System.out.println("Bands 1");
395 for(Band band : bands){
396 System.out.println(band);
397 }
398
399 query = entityManager.createNamedQuery("getInfoBands");
400 List<BandDTO> bandDTOs = query.getResultList();
401
402 System.out.println("Bands 2");
403 for(BandDTO band : bandDTOs){
404 System.out.println(band);
405 }
406 }
407}
408```
409## 6.- Ejecutar la aplicación
410### run.sh
411```shell
412mvn clean compile assembly:single
413java -jar target/testHibernateMvn-1.0-SNAPSHOT-jar-with-dependencies.jar
414```
415
416### Salida
417```shell
418Bands 1
419Band(id=1, name=Metallica, country=Country(id=1, name=Estados Unidos), styles=[Style(id=1, name=Heavy metal), Style(id=2, name=Trash metal), Style(id=3, name=Speed metal)], year=1981)
420Band(id=2, name=Cannibal Corpse, country=Country(id=1, name=Estados Unidos), styles=[Style(id=4, name=Death metal), Style(id=5, name=Brutal death metal)], year=1988)
421Band(id=3, name=Deicide, country=Country(id=1, name=Estados Unidos), styles=[Style(id=4, name=Death metal)], year=1987)
422Band(id=4, name=Meshuggah, country=Country(id=2, name=Suecia), styles=[Style(id=6, name=Metal extremo), Style(id=7, name=Djent)], year=1987)
423Band(id=5, name=Criminal, country=Country(id=3, name=Chile), styles=[Style(id=2, name=Trash metal), Style(id=4, name=Death metal), Style(id=8, name=Groove metal)], year=1991)
424Band(id=6, name=Death, country=Country(id=1, name=Estados Unidos), styles=[Style(id=4, name=Death metal), Style(id=9, name=Death metal técnico), Style(id=10, name=Death metal progresivo)], year=1983)
425Band(id=7, name=Children of bodom, country=Country(id=4, name=Finlandia), styles=[Style(id=11, name=Death metal melódico), Style(id=12, name=Power metal)], year=1997)
426Bands 2
427BandDTO(id=2, name=Cannibal Corpse, styles=Death metal,Brutal death metal, country=Estados Unidos, year=1988)
428BandDTO(id=7, name=Children of bodom, styles=Death metal melódico,Power metal, country=Finlandia, year=1997)
429BandDTO(id=5, name=Criminal, styles=Trash metal,Death metal,Groove metal, country=Chile, year=1991)
430BandDTO(id=6, name=Death, styles=Death metal,Death metal técnico,Death metal progresivo, country=Estados Unidos, year=1983)
431BandDTO(id=3, name=Deicide, styles=Death metal, country=Estados Unidos, year=1987)
432BandDTO(id=4, name=Meshuggah, styles=Metal extremo,Djent, country=Suecia, year=1987)
433BandDTO(id=1, name=Metallica, styles=Heavy metal,Trash metal,Speed metal, country=Estados Unidos, year=1981)
434```