Главная страница
Навигация по странице:

  • результат работы программы

  • Связывание коллекций Ассоциативное связывание Связывание компоннетов Рассмотрим каждую из них:Связывание коллекций

  • Ассоциативное связывание Связывание ассоциаций – это связывание (mapping) классов и отношений между таблицами в БД. Сущействует 4 типа таких зависимостей: Many-to-One

  • One-to-One

  • Many-to-Many

  • ЭТОЙ ССЫЛКЕ

  • Руководство по Hibernate. Руководство по Hibernate


    Скачать 186.74 Kb.
    НазваниеРуководство по Hibernate
    Дата25.11.2021
    Размер186.74 Kb.
    Формат файлаdocx
    Имя файлаРуководство по Hibernate.docx
    ТипРуководство
    #282046
    страница3 из 7
    1   2   3   4   5   6   7

    Пример простого приложения.


    В предыдущих статьях из цикла, посвященного Hibernate мы рассмотрели базовые понятия и ключевые функции этого ORM фреймворка. В этой статье мы создадим небольшое приложение, которое резюмирует всё, о чём мы говорили до этого.

    Исходный код проекта можно скачать по ЭТОЙ ССЫЛКЕ.

    Итак, во-первых мы создадим POJO – класс Developer.java, который соотвтетсвует правилам POJO.

    Developer.java
    package net.proselyte.hibernate.example;
    public class Developer {

    private int id;

    private String firstName;

    private String lastName;

    private String specialty;

    private int experience;
    /**

    * Default Constructor

    */

    public Developer() {

    }
    /**

    * Plain constructor

    */

    public Developer(int id, String firstName, String lastName, String specialty, int experience) {

    this.id = id;

    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;

    }
    /**

    * toString method (optional)

    */

    @Override

    public String toString() {

    return "Developer{" +

    "id=" + id +

    ", firstName='" + firstName + '\'' +

    ", lastName='" + lastName + '\'' +

    ", specialty='" + specialty + '\'' +

    ", experience=" + experience +

    '}';

    }

    }

    Вторым шагом будет создание таблицы в базе данных (далее – БД).
    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)

    );
    Шаг 3 – создание конфигурационного файла hibernate.cfg.xml

    hibernate.cfg.xml


    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">





    org.hibernate.dialect.MySQLDialect

    com.mysql.jdbc.Driver

    ИМЯ ВАШЕЙ БД is the database name -->


    jdbc:mysql://localhost/ИМЯ_ВАШЕЙ_БАЗЫ_ДАННЫХ

    ВАШЕ ИМЯ ПОЛЬЗОВАТЕЛЯ

    ВАШ ПАРОЛЬ





    Четвёртый шаг – создание конфигурационного XML – файла Developer.hbm.xml

    Developer.hbm.xml


    "-//Hibernate/Hibernate Mapping DTD//EN"

    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">







    This class contains developer's details.












    И финальный шаг – создание основного класса приложения DeveloperRunner.java

    DeveloperRunner.java
    package net.proselyte.hibernate.example;
    import net.proselyte.hibernate.example.model.Developer;

    import org.hibernate.Session;

    import org.hibernate.SessionFactory;

    import org.hibernate.Transaction;

    import org.hibernate.cfg.Configuration;
    import java.util.List;
    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("Adding developer's records to the DB");

    /**

    * Adding developer's records to the database (DB)

    */

    developerRunner.addDeveloper("Proselyte", "Developer", "Java Developer", 2);

    developerRunner.addDeveloper("Some", "Developer", "C++ Developer", 2);

    developerRunner.addDeveloper("Peter", "UI", "UI Developer", 4);
    System.out.println("List of developers");

    /**

    * List developers

    */

    List developers = developerRunner.listDevelopers();

    for (Developer developer : developers) {

    System.out.println(developer);

    }

    System.out.println("===================================");

    System.out.println("Removing Some Developer and updating Proselyte");

    /**

    * Update and Remove developers

    */

    developerRunner.updateDeveloper(10, 3);

    developerRunner.removeDeveloper(11);
    System.out.println("Final list of developers");

    /**

    * List developers

    */

    developers = developerRunner.listDevelopers();

    for (Developer developer : developers) {

    System.out.println(developer);

    }

    System.out.println("===================================");
    }
    public void addDeveloper(String firstName, String lastName, String specialty, int experience) {

    Session session = sessionFactory.openSession();

    Transaction transaction = null;
    transaction = session.beginTransaction();

    Developer developer = new Developer(firstName, lastName, specialty, experience);

    session.save(developer);

    transaction.commit();

    session.close();

    }
    public List listDevelopers() {

    Session session = this.sessionFactory.openSession();

    Transaction transaction = null;
    transaction = session.beginTransaction();

    List developers = session.createQuery("FROM Developer").list();
    transaction.commit();

    session.close();

    return developers;

    }
    public void updateDeveloper(int developerId, int experience) {

    Session session = this.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 = this.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=7538 -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.example.DeveloperRunner

    Feb 18, 2016 2:30:00 PM org.hibernate.Version logVersion

    INFO: HHH000412: Hibernate Core {5.0.7.Final}

    Feb 18, 2016 2:30:00 PM org.hibernate.cfg.Environment

    INFO: HHH000206: hibernate.properties not found

    Feb 18, 2016 2:30:00 PM org.hibernate.cfg.Environment buildBytecodeProvider

    INFO: HHH000021: Bytecode provider name : javassist

    Feb 18, 2016 2:30:00 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager

    INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}

    Feb 18, 2016 2:30:02 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure

    WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)

    Feb 18, 2016 2:30:02 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 18, 2016 2:30:02 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator

    INFO: HHH10001001: Connection properties: {user=root, password=****}

    Feb 18, 2016 2:30:02 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator

    INFO: HHH10001003: Autocommit mode: false

    Feb 18, 2016 2:30:02 PM org.hibernate.engine.jdbc.connections.internal.PooledConnections

    INFO: HHH000115: Hibernate connection pool size: 20 (min=1)

    Thu Feb 18 14:30:02 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 18, 2016 2:30:02 PM org.hibernate.dialect.Dialect

    INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect

    Adding developer's records to the DB

    List of developers

    Feb 18, 2016 2:30:03 PM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService

    INFO: HHH000397: Using ASTQueryTranslatorFactory

    Developer:

    id: 10

    First Name: Proselyte

    Last Name: Developer

    Specialty: Java Developer

    Experience: 2
    Developer:

    id: 11

    First Name: Some

    Last Name: Developer

    Specialty: C++ Developer

    Experience: 2
    Developer:

    id: 12

    First Name: Peter

    Last Name: UI

    Specialty: UI Developer

    Experience: 4
    ===================================

    Removing Some Developer and updating Proselyte

    Final list of developers

    Developer:

    id: 10

    First Name: Proselyte

    Last Name: Developer

    Specialty: Java Developer

    Experience: 3
    Developer:

    id: 12

    First Name: Peter

    Last Name: UI

    Specialty: UI Developer

    Experience: 4
    ===================================

    В этой статье мы создали простейшее приложение с использование Hibernate.
    Прим. если у Вас возникают проблемы с редактированием и удалением пользователей – обратите внимание на ID разработчиков.

    Виды связей.

    До этого момента мы рассматривали только простейшие виды связей между классами и таблицами в базах данных (далее – БД). Но давайте рассмотрим более детально виды связей в ORM.
    Связи в ORM деляся на 3 гурппы:

    • Связывание коллекций

    • Ассоциативное связывание

    • Связывание компоннетов

    Рассмотрим каждую из них:

    Связывание коллекций

    Если среди значений класса есть коллекции (collections) каких-либо значений, мы можем связать (map) их с помощью любого интерфейса коллекций, доступных в Java.

    В Hibernate мы можем оперировать следующими коллекциями:

    java.util.List (ссылка на пример)

    Связывается (mapped) с помощью элемента и инициализируется с помощью java.util.ArrayList

    java.util.Collection (ссылка на пример)

    Связывается (mapped) с помощью элементов или и инициализируется с помощью java.util.ArrayList

    java.util. Set (ссылка на пример)

    Связывается (mapped) с помощью элемента и инициализируется с помощью java.util.HashSet

    java.util.SortedSet (ссылка на пример)

    Связывается (mapped) с помощью элемента и инициализируется с помощью java.util.TreeSet. В качестве параметра для сравнения может выбрать либо компаратор, либо естественный порядок.

    java.util.Map (ссылка на пример)

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

    java.util.SortedMap (ссылка на пример)

    Связывается (mapped) с помощью элемента и инициализируется с помощью java.util.TreeMap. В качестве параметра для сравнения может выбрать либо компаратор, либо естественный порядок.

     

    Ассоциативное связывание

    Связывание ассоциаций  – это связывание (mapping) классов и отношений между таблицами в БД. Сущействует 4 типа таких зависимостей:

    Many-to-One (ссылка на пример)

    Связывание (mapping) отнощений many-to-one с использованием Hibernate.

    One-to-One (ссылка на пример)

    Связывание (mapping) отнощений one-to-one с использованием Hibernate.

    One-to-Many (ссылка на пример)

    Связывание (mapping) отнощений one-to-many с использованием Hibernate.

    Many-to-Many (ссылка на пример)

    Связывание (mapping) отнощений many-to-many с использованием Hibernate.

     

    Связывание компонентов

    Возможна ситуация, при которой наш Java – класс имеет ссылку на другой класс, как одну из переменных. Если класс, на который мы ссылаемся не имеет своего собственного жизненного цикла и полностью зависит от жизненного цикла класса, который на него ссылается, то класс, на который ссылаются называется классом Компонентом (Component Class).

    По ЭТОЙ ССЫЛКЕ приведён пример связывания компонентов.
    1   2   3   4   5   6   7


    написать администратору сайта