Hibernate merge

后端 未结 3 1529
孤城傲影
孤城傲影 2021-02-04 12:35

I am testing hibernate and giving this query to

transaction = session.beginTransaction();
city = new City(\"A\");
city  = (City)session.merge(city);
city.setNam         


        
相关标签:
3条回答
  • 2021-02-04 13:00

    It's a sequencing issue. Actually not an issue. Hibernate is doing exactly what you told it to do. As @TejasArjun says, merge is about merging in deteched data. here's what is going on:

    ...
    city  = (City)session.merge(city); 
    // No different to save(). Hibernate schedules an insert to the
    // database to store the current record.
    
    city.setName("B"); 
    // The object is now flagged as dirty and needing to be saved. 
    // Hiberate automatically tracks properties on objects and knows when they change.
    
    transaction.commit(); 
    // Hibernate sees that 'city' has been changed since it was saved, 
    // so it schedules an update to store the new data.
    
    0 讨论(0)
  • 2021-02-04 13:07

    Because session is not closed yet and in persistence terms city object is still attached to session. So, any changes in that object will be listened by hibernate session and appropriate dml statement will be invoked.

    0 讨论(0)
  • 2021-02-04 13:09

    I will try to explain using a more concrete example. Suppose you have a scenario like below :

    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    User userA = (User)session.get(User.class, 1101);
    transaction.commit();
    session.close();
    // Since session is closed, userA is detached.
    
    session = sessionFactory.openSession();
    transaction = session.beginTransaction();
    User userB = (User)session.get(User.class, 1101);
    //Now here,  userB represents the same persistent row as userA.
    //When an attempt to reattach userA occurs, an exception is thrown
    session.update(userA);
    transaction.commit();
    session.close();
    

    Exception when an attempt to reattach a Detached object, userA is made.

    Exception in thread "main" org.hibernate.NonUniqueObjectException: a   
    different object with the same identifier value was already associated
    with the session:
    
    This is because Hibernate is enforcing that only a single instance of a Persistent    object exists in memory.
    

    To get around the above problem, merge() is used, as shown below :

    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    User userA = (User)session.get(User.class, 1101);
    transaction.commit();
    session.close();
    //userA is now detached as session is closed.
    
    session = sessionFactory.openSession();
    transaction = session.beginTransaction();
    User userB = (User)session.get(User.class, 1101);
    User userC = (User)session.merge(userA);
    if (userB == userC) {
      System.out.println("Reattched user is equal");
    }
    transaction.commit();
    session.close();
    
    0 讨论(0)
提交回复
热议问题