Quick Contact

    Hibernate

    Hibernate 5 – merge() Example

    How to use Session.merge()In hibernate; both merge() and update() methods updates an entity and can also affect the state of an object i.e. from detached to persistent. In this article, we will explore the use of merge() method. method to merge an entity in Hibernate Application.

    Session.merge(Object object)

    This method copies the state of the given object onto the persistent object with the same identifier. If there is no persistent instance currently associated with the session, it will be loaded. Return the persistent instance. If the given instance is unsaved, save a copy of and return it as a newly persistent instance. The given instance does not become associated with the session. This operation cascades to associated instances if the association is mapped with cascade=”merge”.

    Add jar Dependencies to pom.xml

    < project
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    < modelVersion>4.0.0< /modelVersion>
    < parent>
    < groupId>net.ducatindia.hibernate< /groupId>
    < artifactId>hibernate-tutorial< /artifactId>
    < version>0.0.1-SNAPSHOT< /version>
    < /parent>
    < artifactId>hibernate-merge-entity-example< /artifactId>
    < properties>
    < project.build.sourceEncoding>UTF-8< /project.build.sourceEncoding>
    < /properties>
    < dependencies>
    < !-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    < dependency>
    < groupId>mysql< /groupId>
    < artifactId>mysql-connector-java< /artifactId>
    < version>8.0.13< /version>
    < /dependency>
    < !-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
    < dependency>
    < groupId>org.hibernate< /groupId>
    < artifactId>hibernate-core< /artifactId>
    < version>5.3.7.Final< /version>
    < /dependency>
    < /dependencies>
    < build>
    < sourceDirectory>src/main/java< /sourceDirectory>
    < plugins>
    < plugin>
    < artifactId>maven-compiler-plugin< /artifactId>
    < version>3.5.1< /version>
    < configuration>
    < source>1.8< /source>
    < target>1.8< /target>
    < /configuration>
    < /plugin>
    < /plugins>
    < /build>
    < /project>
    

    Creating the JPA Entity Class(Persistent class)

    • A simple Persistent class should follow some rules:
    • A no-arg constructor:

      It is recommended that you have a default constructor at least package visibility so that hibernate can create the instance of the Persistent class by newInstance() method.

    • Provide an identifier property:

      It is better to assign an attribute as id. This attribute behaves as a primary key in a database.

    • Declare getter and setter methods:

      The Hibernate recognizes the method by getter and setter method names by default.

    • Prefer non-final class:

      Hibernate uses the concept of proxies, that depends on the persistent class. The application programmer will not be able to use proxies for lazy association fetching.

    Create a Student entity class under net.javaguides.hibernate.entity package as follows.

    packagenet.ducatindia.hibernate.entity;
    
    importjavax.persistence.Column;
    importjavax.persistence.Entity;
    importjavax.persistence.GeneratedValue;
    importjavax.persistence.GenerationType;
    importjavax.persistence.Id;
    importjavax.persistence.Table;
    
    @Entity
    @Table(name = "student")
    public class Student {
    
        @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    privateint id;
    
    @Column(name = "first_name")
    private String firstName;
    
    @Column(name = "last_name")
    private String lastName;
    
    @Column(name = "email")
    private String email;
    
    public Student() {
    
        }
    
    public Student(String firstName, String lastName, String email) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.email = email;
        }
    
    publicintgetId() {
    return id;
        }
    
    public void setId(int id) {
            this.id = id;
        }
    
    public String getFirstName() {
    returnfirstName;
        }
    
    public void setFirstName(String firstName) {
    this.firstName = firstName;
        }
    
    public String getLastName() {
    returnlastName;
        }
    
    public void setLastName(String lastName) {
    this.lastName = lastName;
        }
    
    public String getEmail() {
    return email;
        }
    
    public void setEmail(String email) {
    this.email = email;
        }
    
        @Override
    public String toString() {
            return "Student [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + "]";
        }
    }
    

    Create a Hibernate configuration file – hibernate.cfg.xml

    The configuration file contains information about the database and mapping file. Conventionally, its name should be hibernate.cfg.xml.

    Let’s create an XML file named as hibernate.cfg.xml under resources folder and write the following code in it.

    < !DOCTYPEhibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    < hibernate-configuration>
    < session-factory>
    < !-- JDBC Database connection settings -->
    < propertyname="connection.driver_class">com.mysql.cj.jdbc.Driver< /property>
    < propertyname="connection.url">jdbc:mysql://localhost:3306/hibernate_db?useSSL=false< /property>
    < propertyname="connection.username">root< /property>
    < propertyname="connection.password">root< /property>
    < !-- JDBC connection pool settings ... using built-in test pool -->
    < propertyname="connection.pool_size">1< /property>
    < !-- Select our SQL dialect -->
    < propertyname="dialect">org.hibernate.dialect.MySQL5Dialect< /property>
    < !-- Echo the SQL to stdout -->
    < propertyname="show_sql">true< /property>
    < !-- Set the current session context -->
    < propertyname="current_session_context_class">thread< /property>
    < !-- Drop and re-create the database schema on startup -->
    < propertyname="hbm2ddl.auto">create-drop< /property>
    < !--dbcp connection pool configuration -->
    < propertyname="hibernate.dbcp.initialSize">5< /property>
    < propertyname="hibernate.dbcp.maxTotal">20< /property>
    < propertyname="hibernate.dbcp.maxIdle">10< /property>
    < propertyname="hibernate.dbcp.minIdle">5< /property>
    < propertyname="hibernate.dbcp.maxWaitMillis">-1< /property>
    < mappingclass="net.ducatindia.hibernate.entity.Student" />
    < /session-factory>
    < /hibernate-configuration>
    

    Create a Hibernate utility Class

    Create a helper class to bootstrap hibernate SessionFactory. The bootstrapping API is quite flexible, but in most cases, it makes the most sense to think of it as a 3 step process:

    1. Build the StandardServiceRegistry
    2. Build the Metadata

      Use those 2 to build the SessionFactory

    packagenet.ducatindia.hibernate.util;
    
    importorg.hibernate.SessionFactory;
    importorg.hibernate.boot.Metadata;
    importorg.hibernate.boot.MetadataSources;
    importorg.hibernate.boot.registry.StandardServiceRegistry;
    importorg.hibernate.boot.registry.StandardServiceRegistryBuilder;
    
    publicclassHibernateUtil {
    privatestaticStandardServiceRegistry registry;
    privatestaticSessionFactorysessionFactory;
    
    publicstaticSessionFactorygetSessionFactory() {
    if (sessionFactory==null) {
    try {
    // Create registry
    registry=newStandardServiceRegistryBuilder().configure().build();
    
    // Create MetadataSources
    MetadataSources sources =newMetadataSources(registry);
    
    // Create Metadata
    Metadatametadata=sources.getMetadataBuilder().build();
    
    // Create SessionFactory
    sessionFactory=metadata.getSessionFactoryBuilder().build();
    
                } catch (Exception e) {
    e.printStackTrace();
    if (registry !=null) {
    StandardServiceRegistryBuilder.destroy(registry);
                    }
                }
            }
    returnsessionFactory;
        }
    
    publicstaticvoidshutdown() {
    if (registry !=null) {
    StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    }
    

    Create the main App class and Run an Application

    Here is main App class which is used to connect MySQL database and merge Student object in a database table. Let’s test Hibernate application to connect MySQL database.

    Note that the comments in below code are self-descriptive.

    packagenet.ducatindia.hibernate;
    
    importorg.hibernate.Session;
    importorg.hibernate.Transaction;
    
    importnet.ducatindia.hibernate.entity.Student;
    importnet.ducatindia.hibernate.util.HibernateUtil;
    
    publicclassApp {
    
    publicstaticvoidmain(String[] args) {
    
    TransactiontransactionOne=null;
    TransactiontransactionTwo=null;
    SessionsessionOne=HibernateUtil.getSessionFactory().openSession();
    transactionOne=sessionOne.beginTransaction();
    
    // create student object
    Studentstudent=newStudent("Rajan", "Mishra", "rajanmishra@ducatindia.com");
    
    // save student object
    sessionOne.save(student);
    
    // commit transaction
    transactionOne.commit();
    
    // close first session 
    sessionOne.close();
    
    // open sessionTwo
    SessionsessionTwo=HibernateUtil.getSessionFactory().openSession();
    
    transactionTwo=sessionTwo.beginTransaction();
    
    // change detached student object name
    student.setFirstName("Ram");
    
    // merge method is to update a persistent entity instance with new field values
    // from a detached entity instance.
    sessionTwo.merge(student);
    
    transactionTwo.commit();
    
    sessionTwo.close();
        }
    }
    

    Apply now for Advanced Java Training Course

    Copyright 1999- Ducat Creative, All rights reserved.

    Anda bisa mendapatkan server slot online resmi dan terpercaya tentu saja di sini. Sebagai salah satu provider yang menyediakan banyak pilihan permainan.