Hibernate mapping java util map

Руководство по Hibernate. Виды связей. Map Mapping.

Коллекция Java, в которой хранятся пары “ключ – значение” и в которой допускается хранение только уникальных эелементов, называется Map.

Map связывается (mapped) fс помощью элемента и (в случае нупорядоченной Map) инициализируется с помощью java.util.HashMap.

Для понимания того, как это работает на практике, рассмотрим пример простого приложения.

Шаг 1. Создадим две таблицы в бахе данных (далее – БД)
HIBERNATE_DEVELOPERS

 CREATE TABLE HIBERNATE_DEVELOPERS( ID INT NOT NULL AUTO_INCREMENT, FIRST_NAME VARCHAR(50) DEFAULT NULL, LAST_NAME VARCHAR(50) DEFAULT NULL, SPECIALTY VARCHAR(50) DEFAULT NULL, EXPERIENCE INT DEFAULT NULL, PRIMARY KEY(ID) ); 
create table HIBERNATE_PROJECTS ( id INT NOT NULL auto_increment, SPHERE VARCHAR(50) default NULL, PROJECT_NAME VARCHAR(50) default NULL, COMPANY VARCHAR(50) default NULL, DEVELOPER_ID INT default NULL, PRIMARY KEY (id) ); 

Мы будем использовать отношение one-to-many между таблицами HIBERNATE_DEVELOPERS и HIBERNATE_PROJECTS.

Шаг 2. Создадим POJO – классы

Developer.java

 package net.proselyte.hibernate.mappings.map; import java.util.Map; public class Developer < private int id; private String firstName; private String lastName; private String specialty; private int experience; private Mapprojects; /** * Default Constructor */ public Developer() < >/** * Plain constructor */ public Developer(String firstName, String lastName, String specialty, int experience) < this.firstName = firstName; this.lastName = lastName; this.specialty = specialty; this.experience = experience; >/** * Getters and Setters */ public int getId() < return id; >public void setId(int id) < this.id = id; >public String getFirstName() < return firstName; >public void setFirstName(String firstName) < this.firstName = firstName; >public String getLastName() < return lastName; >public void setLastName(String lastName) < this.lastName = lastName; >public String getSpecialty() < return specialty; >public void setSpecialty(String specialty) < this.specialty = specialty; >public int getExperience() < return experience; >public void setExperience(int experience) < this.experience = experience; >public Map getProjects() < return projects; >public void setProjects(Map projects) < this.projects = projects; >/** * toString method (optional) */ @Override public String toString() < return "Developer:\n" + "id: " + id + "\nFirst Name: " + firstName + "\n" + "Last Name: " + lastName + "\n" + "Specialty: " + specialty + "\n" + "Experience: " + experience + "\n"; >> 

Project.java

 package net.proselyte.hibernate.mappings.map; public class Project < private int id; private String projectName; private String companyName; /** * Constructors */ public Project() < >public Project(String projectName, String companyName) < this.projectName = projectName; this.companyName = companyName; >/** * Getters and Setters */ public int getId() < return id; >public void setId(int id) < this.id = id; >public String getProjectName() < return projectName; >public void setProjectName(String projectName) < this.projectName = projectName; >public String getCompanyName() < return companyName; >public void setCompanyName(String companyName) < this.companyName = companyName; >@Override public String toString() < return "Project:\n" + "id: " + id + "\nProject Name: " + projectName + "\nCompany Name: " + companyName + "\n"; >> 

Шаг 3. Создадим конфигурационные файлы

hibernate.cfg.xml

      org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver  jdbc:mysql://localhost/ИМЯ ВАШЕЙ БД ВАШЕ ИМЯ ПОЛЬЗОВАТЕЛЯ ВАШ ПАРОЛЬ     

Developer.hbm.xml

      This class contains developer's details.            This class contains project's records.       

Шаг 4. Создаём класс DeveloperRunner.java

Читайте также:  Call JavaScript function on page load.

DeveloperRunner.java

 package net.proselyte.hibernate.mappings.map; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import java.util.HashMap; import java.util.List; import java.util.Map; public class DeveloperRunner < private static SessionFactory sessionFactory; public static void main(String[] args) < sessionFactory = new Configuration().configure().buildSessionFactory(); DeveloperRunner developerRunner = new DeveloperRunner(); System.out.println("Creating the collection of projects."); HashMapprojects1 = new HashMap(); projects1.put("Computer Science", new Project("Proselyte Tutorial", "proselyte.net")); projects1.put("Aviation", new Project("SkybleLib", "SkybleSoft")); HashMap projects2 = new HashMap(); projects2.put("Some Sphere", new Project("Some Project", "Some Company")); projects2.put("E-commerce", new Project("One more Project", "One more Company")); System.out.println("Adding developer's records to the DB"); Integer developerId1 = developerRunner.addDeveloper("Proselyte", "Developer", "Java Developer", 2, projects1); Integer developerId2 = developerRunner.addDeveloper("Peter", "UI", "UI Developer", 4, projects2); System.out.println("List of developers"); developerRunner.listDevelopers(); System.out.println("==================================="); System.out.println("Updating Proselyte"); developerRunner.updateDeveloper(developerId1, 3); System.out.println("Final list of developers"); developerRunner.listDevelopers(); System.out.println("==================================="); sessionFactory.close(); > public Integer addDeveloper(String firstName, String lastName, String specialty, int experience, HashMap projects) < Session session = sessionFactory.openSession(); Transaction transaction = null; Integer developerId = null; transaction = session.beginTransaction(); Developer developer = new Developer(firstName, lastName, specialty, experience); developer.setProjects(projects); developerId = (Integer) session.save(developer); transaction.commit(); session.close(); return developerId; >public void listDevelopers() < Session session = sessionFactory.openSession(); Transaction transaction = null; transaction = session.beginTransaction(); List developers = session.createQuery("FROM Developer").list(); for (Developer developer : developers) < System.out.println(developer); Mapprojects = developer.getProjects(); System.out.println(developer.getFirstName() + "'s projects:\n"); System.out.println(projects); System.out.println("\n================\n"); > session.close(); > public void updateDeveloper(int developerId, int experience) < Session session = sessionFactory.openSession(); Transaction transaction = null; transaction = session.beginTransaction(); Developer developer = (Developer) session.get(Developer.class, developerId); developer.setExperience(experience); session.update(developer); transaction.commit(); session.close(); >public void removeDeveloper(int developerId) < Session session = sessionFactory.openSession(); Transaction transaction = null; transaction = session.beginTransaction(); Developer developer = (Developer) session.get(Developer.class, developerId); session.delete(developer); transaction.commit(); session.close(); >> 

Если всё было сделано правильно, то в результате работы программы мы получилм, примерно, следующий результат:

 /usr/lib/jvm/java-8-oracle/bin/java -Didea.launcher.port=7540 -Didea.launcher.bin.path=/home/proselyte/Programming/Soft/IntellijIdea/bin -Dfile.encoding=UTF-8 -classpath /usr/lib/jvm/java-8-oracle/jre/lib/management-agent.jar:/usr/lib/jvm/java-8-oracle/jre/lib/plugin.jar:/usr/lib/jvm/java-8-oracle/jre/lib/rt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jsse.jar:/usr/lib/jvm/java-8-oracle/jre/lib/charsets.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jce.jar:/usr/lib/jvm/java-8-oracle/jre/lib/resources.jar:/usr/lib/jvm/java-8-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jfxswt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jfr.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/dnsns.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/jaccess.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/nashorn.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/localedata.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/jfxrt.jar:/home/proselyte/Programming/IdeaProjects/ProselyteTutorials/Hibernate/target/classes:/home/proselyte/.m2/repository/org/springframework/spring-core/4.1.1.RELEASE/spring-core-4.1.1.RELEASE.jar:/home/proselyte/.m2/repository/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar:/home/proselyte/.m2/repository/org/springframework/spring-web/4.1.1.RELEASE/spring-web-4.1.1.RELEASE.jar:/home/proselyte/.m2/repository/org/springframework/spring-aop/4.1.1.RELEASE/spring-aop-4.1.1.RELEASE.jar:/home/proselyte/.m2/repository/aopalliance/aopalliance/1.0/aopalliance-1.0.jar:/home/proselyte/.m2/repository/org/springframework/spring-beans/4.1.1.RELEASE/spring-beans-4.1.1.RELEASE.jar:/home/proselyte/.m2/repository/org/springframework/spring-context/4.1.1.RELEASE/spring-context-4.1.1.RELEASE.jar:/home/proselyte/.m2/repository/javax/servlet/servlet-api/2.5/servlet-api-2.5.jar:/home/proselyte/.m2/repository/org/springframework/spring-webmvc/4.1.1.RELEASE/spring-webmvc-4.1.1.RELEASE.jar:/home/proselyte/.m2/repository/org/springframework/spring-expression/4.1.1.RELEASE/spring-expression-4.1.1.RELEASE.jar:/home/proselyte/.m2/repository/org/springframework/integration/spring-integration-file/4.2.1.RELEASE/spring-integration-file-4.2.1.RELEASE.jar:/home/proselyte/.m2/repository/org/springframework/integration/spring-integration-core/4.2.1.RELEASE/spring-integration-core-4.2.1.RELEASE.jar:/home/proselyte/.m2/repository/org/springframework/spring-messaging/4.2.2.RELEASE/spring-messaging-4.2.2.RELEASE.jar:/home/proselyte/.m2/repository/org/springframework/retry/spring-retry/1.1.2.RELEASE/spring-retry-1.1.2.RELEASE.jar:/home/proselyte/.m2/repository/org/springframework/spring-tx/4.2.2.RELEASE/spring-tx-4.2.2.RELEASE.jar:/home/proselyte/.m2/repository/commons-io/commons-io/2.4/commons-io-2.4.jar:/home/proselyte/.m2/repository/org/hibernate/hibernate-core/5.0.7.Final/hibernate-core-5.0.7.Final.jar:/home/proselyte/.m2/repository/org/jboss/logging/jboss-logging/3.3.0.Final/jboss-logging-3.3.0.Final.jar:/home/proselyte/.m2/repository/org/hibernate/javax/persistence/hibernate-jpa-2.1-api/1.0.0.Final/hibernate-jpa-2.1-api-1.0.0.Final.jar:/home/proselyte/.m2/repository/org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar:/home/proselyte/.m2/repository/antlr/antlr/2.7.7/antlr-2.7.7.jar:/home/proselyte/.m2/repository/org/apache/geronimo/specs/geronimo-jta_1.1_spec/1.1.1/geronimo-jta_1.1_spec-1.1.1.jar:/home/proselyte/.m2/repository/org/jboss/jandex/2.0.0.Final/jandex-2.0.0.Final.jar:/home/proselyte/.m2/repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar:/home/proselyte/.m2/repository/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2.jar:/home/proselyte/.m2/repository/org/hibernate/common/hibernate-commons-annotations/5.0.1.Final/hibernate-commons-annotations-5.0.1.Final.jar:/home/proselyte/.m2/repository/mysql/mysql-connector-java/5.1.38/mysql-connector-java-5.1.38.jar:/home/proselyte/Programming/Soft/IntellijIdea/lib/idea_rt.jar com.intellij.rt.execution.application.AppMain net.proselyte.hibernate.mappings.map.DeveloperRunner Feb 20, 2016 8:30:38 PM org.hibernate.Version logVersion INFO: HHH000412: Hibernate Core Feb 20, 2016 8:30:38 PM org.hibernate.cfg.Environment INFO: HHH000206: hibernate.properties not found Feb 20, 2016 8:30:38 PM org.hibernate.cfg.Environment buildBytecodeProvider INFO: HHH000021: Bytecode provider name : javassist Feb 20, 2016 8:30:38 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager INFO: HCANN000001: Hibernate Commons Annotations Feb 20, 2016 8:30:40 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!) Feb 20, 2016 8:30:40 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001005: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/PROSELYTE_TUTORIAL] Feb 20, 2016 8:30:40 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001001: Connection properties: Feb 20, 2016 8:30:40 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001003: Autocommit mode: false Feb 20, 2016 8:30:40 PM org.hibernate.engine.jdbc.connections.internal.PooledConnections INFO: HHH000115: Hibernate connection pool size: 20 (min=1) Sat Feb 20 20:30:40 EET 2016 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. Feb 20, 2016 8:30:40 PM org.hibernate.dialect.Dialect INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect Creating the collection of projects. Adding developer's records to the DB List of developers Feb 20, 2016 8:30:41 PM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService INFO: HHH000397: Using ASTQueryTranslatorFactory Developer: id: 79 First Name: Proselyte Last Name: Developer Specialty: Java Developer Experience: 2 Proselyte's projects: ================ Developer: id: 80 First Name: Peter Last Name: UI Specialty: UI Developer Experience: 4 Peter's projects: ================ =================================== Updating Proselyte Final list of developers Developer: id: 79 First Name: Proselyte Last Name: Developer Specialty: Java Developer Experience: 3 Proselyte's projects: ================ Developer: id: 80 First Name: Peter Last Name: UI Specialty: UI Developer Experience: 4 Peter's projects: ================ =================================== Feb 20, 2016 8:30:41 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop INFO: HHH10001008: Cleaning up connection pool [jdbc:mysql://localhost/PROSELYTE_TUTORIAL] 

В этой статье мы рассмотрели пример связывания с использованием Map.

Читайте также:  Найти среднее арифметическое элементов массива php

Источник

Оцените статью