Considérations sur le cadre de persistance Java 2017 (8) Hibernate5

Post précédent

Préface

Étant donné que j'écris en utilisant le temps d'intervalle, je vous serais reconnaissant si vous pouviez indiquer les parties avec une précision médiocre. Tout d'abord, excluez ceux qui sont EOL. Nous considérerons les fonctions payantes, mais nous ne les utiliserons pas réellement, en raison du problème des poches. La base de données utilisée est fixée à Postgre pour une raison stupide telle que "Eh bien, peut-être que Postgre peut être utilisé même s'il n'est pas spécifié."

environnement

Structure de la table

employeeテーブルからpostテーブルにID紐づけ

Gamme de correspondance

ORM Transaction Data Model DSL

○: Correspondance ×: non pris en charge *: Il existe une fonction pour créer des tables liées lorsqu'il existe une relation plusieurs-à-plusieurs.

Impressions

échantillon

Recherche de table unique

Rechercher tout

Main.java


//Le premier tutoriel à recommander JPQL ... et ce n'est pas de type sécurisé ...
session.createQuery("from Employee").list().stream().forEach(o -> {
    Employee e = (Employee)o;
    Main.sysout(e);
});

//CriteriaBuilder est bien, mais c'est un tutoriel ...
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Employee> query = builder.createQuery(Employee.class);
Root<Employee> root = query.from(Employee.class);
session.createQuery(query.select(root).select(root)).getResultList().stream().forEach(Main::sysout);

//Un tutoriel qui recommande JPQL même depuis EntityManager ……
em.createQuery("from Employee", Employee.class).getResultList().stream().forEach(Main::sysout);

//Après tout, Criteria Builder est bon, c'est un tutoriel ...
CriteriaBuilder builder2 = em.getCriteriaBuilder();
CriteriaQuery<Employee> query2 = builder2.createQuery(Employee.class);
Root<Employee> root2 = query2.from(Employee.class);
em.createQuery(query2.select(root2).select(root2)).getResultList().stream().forEach(Main::sysout);

Main#sysout(Employee).java


public static void sysout(Employee e) {
    System.out.format("%1s: %2s, %3s, %4s\n", e.id, e.first_name, e.middle_name, e.last_name);
}

Recherche de clé primaire

Main.java


//version de session à utiliser
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Employee> query = builder.createQuery(Employee.class);
Root<Employee> root = query.from(Employee.class);
session.createQuery(query.select(root).select(root).where(builder.equal(root.get(Employee_.id), 1L)))
        .getResultList()
        .stream()
        .forEach(Main::sysout);

//Version pour utiliser EntityManager
CriteriaBuilder builder2 = em.getCriteriaBuilder();
CriteriaQuery<Employee> query2 = builder2.createQuery(Employee.class);
Root<Employee> root2 = query2.from(Employee.class);
em.createQuery(query2.select(root2).select(root2).where(builder2.equal(root2.get(Employee_.id), 1L)))
        .getResultList()
        .stream()
        .forEach(Main::sysout);

Jointure de table

Main.java


CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Employee> query = builder.createQuery(Employee.class);
Root<Employee> root = query.from(Employee.class);
session.createQuery(query.select(root).select(root).where(builder.equal(root.get(Employee_.id), 1L)))
        .getResultList()
        .stream()
        .peek(Main::sysout)
        .map(e -> e.posts)
        .flatMap(ps -> ps.stream())
        .forEach(Main::sysout);

CriteriaBuilder builder2 = em.getCriteriaBuilder();
CriteriaQuery<Employee> query2 = builder2.createQuery(Employee.class);
Root<Employee> root2 = query2.from(Employee.class);
em.createQuery(query2.select(root2).select(root2).where(builder2.equal(root2.get(Employee_.id), 0L)))
        .getResultList()
        .stream()
        .peek(Main::sysout)
        .map(e -> e.posts)
        .flatMap(ps -> ps.stream())
        .forEach(Main::sysout);

Main#sysout(Post).java


public static void sysout(Post p) {
    System.out.format("\t%1s: %2s, %3s\n", p.id, p.employee_id, p.name);
}

Employee.java


@Entity
@Table(name="employee")
public class Employee {
    @Id
    public long id;
    public String first_name;
    public String middle_name;
    public String last_name;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "id", referencedColumnName = "employee_id", table = "post")
    public List<Post> posts = new ArrayList<>();

    public long getId() {return this.id;}
    public void setId(long id) {this.id = id;}
    public String getFirst_name() {return this.first_name;}
    public void setFirst_name(String first_name) {this.first_name = first_name;}
    public String getMiddle_name() {return this.middle_name;}
    public void setMiddle_name(String middle_name) {this.middle_name = middle_name;}
    public String getLast_name() {return this.last_name;}
    public void setLast_name(String last_name) {this.last_name = last_name;}
    public List<Post> getPosts() {return this.posts;}
    public void setPosts(List<Post> posts) {this.posts = posts;}
}

Post.java


@Entity
@Table(name = "post")
public class Post {
    @Id
    public long id;
    public long employee_id;
    public String name;

    public long getId() {return this.id;}
    public void setId(long id) {this.id = id;}
    public long getEmployee_id() {return this.employee_id;}
    public void setEmployee_id(long employee_id) {this.employee_id = employee_id;}
    public String getName() {return this.name;}
    public void setName(String name) {this.name = name;}
}

Employee.hbm.xml


<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="hibernate.models">
    <class name="Employee" table="employee">
        <id name="id" column="id"/>
        <property name="first_name" column="first_name"/>
        <property name="middle_name" column="middle_name"/>
        <property name="last_name" column="last_name"/>
        <bag name="posts" table="post">
            <key column="employee_id"/>
            <one-to-many class="Post"/>
        </bag>
    </class>
</hibernate-mapping>

Post.hbm.xml


<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="hibernate.models">
    <class name="Post" table="post">
        <id name="id" column="id"/>
        <property name="employee_id" column="employee_id"/>
        <property name="name" column="name"/>
    </class>
</hibernate-mapping>

Le point

Points addictifs

Après la publication

N'est pas encore.

Article de référence

Recommended Posts

Considérations sur le cadre de persistance Java 2017 (8) Hibernate5
Considération sur le cadre de persistance Java 2017 (résumé) -1
Considération sur le cadre de persistance Java 2017 (6) Ebean
Considération sur le framework de persistance Java 2017 (5) Iciql
Considérations sur le cadre de persistance Java 2017 (7) EclipseLink
Considération sur le framework de persistance Java 2017 (1)
Considérations sur le cadre de persistance Java 2017 (2) Doma2
framework java
Devinez le cadre de persistance Java 2017 (3) Reladomo
Comparaison du framework Java
[Java] Cadre de collection
Conseils pour Play Framework2.5 (Java)
Installez Java sur Mac
Exécutez PostgreSQL sur Java
[Développement] Comparaison du framework Java
Apprentissage du framework Java # 1 (version Mac)
Gestion des versions Java sur macOS
Installez OpenJDK7 (JAVA) sur ubuntu 14.04
Rétrograder Java sur openSUSE Linux
Réflexion sur la manipulation de chaînes Java
En passant Java Gold SE 8
Oracle Java 8 sur Docker Ubuntu
Notes de révision de Java Collections Framework
Installez Java sur WSL Ubuntu 18.04
Exécutez l'applet java sur ubuntu
Mettez Oracle Java 8 dans CircleCI 2
Changer la version java sur CentOS
Installez java 1.8.0 sur Amazon linux2