Advertisement
pperez_awto

Untitled

Apr 17th, 2020
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.21 KB | None | 0 0
  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
  7. mvn -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
  79. CREATE DATABASE IF NOT EXISTS test;
  80.  
  81. USE test;
  82.  
  83. CREATE TABLE style(
  84.     style_id INTEGER AUTO_INCREMENT,
  85.     style_name VARCHAR(100),
  86.     PRIMARY KEY(style_id)
  87. );
  88.  
  89. INSERT INTO
  90.     style(style_name)
  91. VALUES
  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.  
  105. CREATE TABLE country(
  106.     country_id INTEGER AUTO_INCREMENT,
  107.     country_name VARCHAR(100),
  108.     PRIMARY KEY(country_id)
  109. );
  110.  
  111. INSERT INTO
  112.     country(country_name)
  113. VALUES
  114.     ('Estados Unidos'),
  115.     ('Suecia'),
  116.     ('Chile'),
  117.     ('Finlandia');
  118.  
  119. CREATE 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.  
  128. INSERT INTO
  129.     band(band_name, country_id, band_year)
  130. VALUES
  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.  
  139. CREATE 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.  
  146. INSERT INTO
  147.     band_style(band_id, style_id)
  148. VALUES
  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.  
  158. SELECT * FROM style;
  159. SELECT * FROM country;
  160. SELECT * FROM band;
  161. SELECT * FROM band_style;
  162.  
  163. -- 1.- Listado de bandas y su información
  164. SELECT
  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'
  170. FROM  
  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
  175. GROUP BY
  176.     band.band_id
  177. ORDER 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
  207. package cl.prez.hibernate.model;
  208.  
  209. import javax.persistence.Column;
  210. import javax.persistence.Entity;
  211. import javax.persistence.GeneratedValue;
  212. import javax.persistence.GenerationType;
  213. import javax.persistence.Id;
  214. import javax.persistence.Table;
  215.  
  216. import lombok.Data;
  217.  
  218. @Data
  219. @Entity
  220. @Table(name = "style")
  221. public 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
  234. package cl.prez.hibernate.model;
  235.  
  236. import javax.persistence.Column;
  237. import javax.persistence.Entity;
  238. import javax.persistence.GeneratedValue;
  239. import javax.persistence.GenerationType;
  240. import javax.persistence.Id;
  241. import javax.persistence.Table;
  242.  
  243. import lombok.Data;
  244.  
  245. @Data
  246. @Entity
  247. @Table(name = "country")
  248. public 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
  260. Esta clase es para ejecutar el select "Listado de bandas y su información"
  261. ```java
  262. package cl.prez.hibernate.model.dto;
  263.  
  264. import lombok.AllArgsConstructor;
  265. import lombok.Data;
  266.  
  267. @Data
  268. @AllArgsConstructor
  269. public 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
  280. package cl.prez.hibernate.model;
  281.  
  282. import java.util.List;
  283.  
  284. import javax.persistence.Column;
  285. import javax.persistence.Entity;
  286. import javax.persistence.GeneratedValue;
  287. import javax.persistence.GenerationType;
  288. import javax.persistence.Id;
  289. import javax.persistence.JoinColumn;
  290. import javax.persistence.JoinTable;
  291. import javax.persistence.ManyToMany;
  292. import javax.persistence.ManyToOne;
  293. import javax.persistence.NamedNativeQuery;
  294. import javax.persistence.NamedNativeQueries;
  295. import javax.persistence.Table;
  296. import javax.persistence.SqlResultSetMapping;
  297. import javax.persistence.ConstructorResult;
  298. import javax.persistence.ColumnResult;
  299.  
  300. import cl.prez.hibernate.model.dto.BandDTO;
  301.  
  302. import 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")
  343. public 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
  371. package cl.prez.hibernate;
  372.  
  373. import java.util.List;
  374.  
  375. import javax.persistence.EntityManager;
  376. import javax.persistence.EntityManagerFactory;
  377. import javax.persistence.Persistence;
  378. import javax.persistence.Query;
  379.  
  380. import cl.prez.hibernate.model.Band;
  381. import cl.prez.hibernate.model.dto.BandDTO;
  382.  
  383. public 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
  412. mvn clean compile assembly:single
  413. java -jar target/testHibernateMvn-1.0-SNAPSHOT-jar-with-dependencies.jar
  414. ```
  415.  
  416. ### Salida
  417. ```shell
  418. Bands 1
  419. Band(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)
  420. Band(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)
  421. Band(id=3, name=Deicide, country=Country(id=1, name=Estados Unidos), styles=[Style(id=4, name=Death metal)], year=1987)
  422. Band(id=4, name=Meshuggah, country=Country(id=2, name=Suecia), styles=[Style(id=6, name=Metal extremo), Style(id=7, name=Djent)], year=1987)
  423. Band(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)
  424. Band(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)
  425. Band(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)
  426. Bands 2
  427. BandDTO(id=2, name=Cannibal Corpse, styles=Death metal,Brutal death metal, country=Estados Unidos, year=1988)
  428. BandDTO(id=7, name=Children of bodom, styles=Death metal melódico,Power metal, country=Finlandia, year=1997)
  429. BandDTO(id=5, name=Criminal, styles=Trash metal,Death metal,Groove metal, country=Chile, year=1991)
  430. BandDTO(id=6, name=Death, styles=Death metal,Death metal técnico,Death metal progresivo, country=Estados Unidos, year=1983)
  431. BandDTO(id=3, name=Deicide, styles=Death metal, country=Estados Unidos, year=1987)
  432. BandDTO(id=4, name=Meshuggah, styles=Metal extremo,Djent, country=Suecia, year=1987)
  433. BandDTO(id=1, name=Metallica, styles=Heavy metal,Trash metal,Speed metal, country=Estados Unidos, year=1981)
  434. ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement