0

Hibernateを使用してテーブルのレコードを更新しようとしていますが、レコードが更新されておらず、次回の実行時に時間がかかり、次のエラー:Exception in thread "main" org.hibernate.exception.LockAcquisitionException: could not execute statementスレッド "main"の例外org.hibernate.exception.LockAcquisitionException:ステートメントを実行できませんでした

従業員:

import javax.persistence.CascadeType; 
    import javax.persistence.Entity; 
    import javax.persistence.GeneratedValue; 
    import javax.persistence.Id; 
    import javax.persistence.OneToOne; 
    import javax.persistence.Table; 

    import org.hibernate.annotations.*; 

    @Entity 
    @Table(name = "Emp_Table") 
    public class Employee { 
     @Id 
     @GeneratedValue 
     private int id; 
     private String name; 
     private double salary; 

     @OneToOne(mappedBy = "emp") 
     @Cascade(value = org.hibernate.annotations.CascadeType.ALL) 
     private Address addr; 

     /* Getter-Setter methods */ 
    } 

住所:

import javax.persistence.Column; 
    import javax.persistence.Entity; 
    import javax.persistence.GeneratedValue; 
    import javax.persistence.Id; 
    import javax.persistence.OneToOne; 
    import javax.persistence.PrimaryKeyJoinColumn; 
    import javax.persistence.Table; 

    import org.hibernate.annotations.GenericGenerator; 
    import org.hibernate.annotations.Parameter; 

    @Entity 
    @Table(name = "Addr_Table") 
    public class Address { 

     @Id 
     @Column(name = "eid") 
     @GeneratedValue(generator = "gen") 
     @GenericGenerator(name = "gen", strategy = "foreign", parameters = {@Parameter(name = "property", value = "emp")}) 
     private int id; 
     private String state; 
     private String country; 

     @OneToOne 
     @PrimaryKeyJoinColumn 
     private Employee emp; 

     /* Getter-Setter methods */ 
    } 

HQLExampleにはCRUD操作が含まれています。

package com.Hibernate.Main; 

import java.util.List; 

import org.hibernate.Query; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.hibernate.cfg.Configuration; 

import com.Hibernate.Model.Employee; 
import com.Hibernate.Util.HibernateUtil; 

public class HQLExample { 

    @SuppressWarnings("unchecked") 
    public static void main(String[] args) { 

     SessionFactory factory = new Configuration().configure().buildSessionFactory(); 
     Session session = factory.openSession(); 

     Transaction tx = session.beginTransaction(); 
     Query query = session.createQuery("from Employee"); 
     List<Employee> emp = query.list(); 
     for (Employee empList : emp) { 
      System.out.println("\nID:\t" + empList.getId() + "\nName:\t" + empList.getName() + "\nSalary:\t" 
        + empList.getSalary()); 
     } 

     Query query1 = session.createQuery("from Employee where id = :id"); 
     query1.setInteger("id", 2); 
     Employee empList = (Employee) query1.uniqueResult(); 
     System.out.println(
       "\nID:\t" + empList.getId() + "\nName:\t" + empList.getName() + "\nSalary:\t" + empList.getSalary()); 


     Query query2 = session.createQuery("from Employee"); 
     query2.setFirstResult(1); 
     query2.setFetchSize(1); 
     emp = query2.list(); 
     for (Employee empList1 : emp) { 
      System.out.println("\nID:\t" + empList1.getId() + "\nName:\t" + empList1.getName() + "\nSalary:\t" 
        + empList1.getSalary()); 
     } 

     query = session.createQuery("update Employee set name = :name where id = :id"); 
     query.setParameter("name", "Gaurav"); 
     query.setInteger("id", 2); 
     int result = query.executeUpdate(); 
     System.out.println("\n\nEmployee updated successfully: "+result); 



     query = session.createQuery("delete from Employee where id: eid"); 
     query.setInteger("eid", 4); 
     result = query.executeUpdate(); 
     System.out.println("Employee deleted successfully "+ result);*/ 
    } 
} 

私はレコードを取得することができていますが、レコードを更新する時に、それがレコードを更新したり、長い時間がかかり、エラーをスローしないか:org.hibernate.exception.LockAcquisitionExceptionスレッドの例外「メイン」:可能性文を実行しません。

コマンドを使用すると、プロセスリストが表示され、そこでスリープモードでプロセスを強制終了しようとしました。これらのプロセスを終了すると、私は更新ステートメントを実行できますが、データベースに反映されません。コードをもう一度実行しようとすると、長時間実行されず失敗します。

はhibernate.cfg.xml:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.username">root</property> 
     <property name="hibernate.connection.password">root.123</property> 
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/Hibernate</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
     <property name="hibernate.current_session_context_class">thread</property> 
     <property name="hibernate.hbm2ddl.auto">update</property> 
     <property name="hibernate.show_sql">true</property> 
     <mapping class="com.Hibernate.Model.Address"></mapping> 
     <mapping class="com.Hibernate.Model.Employee"></mapping> 
    </session-factory> 
</hibernate-configuration> 
+0

hibernate.cfg.xmlファイル: –

答えて

0

あなたは、データベースに変更を保存するには、トランザクションをコミットする必要があります。また、セッションとセッションファクトリを閉じる必要があります。リソースをクローズしていない場合、コードはデータベース内のレコードのロックを保持します。

また、削除クエリで構文エラーが発生しました。コードを動作させるためにできる変更は次のとおりです。

query = session.createQuery("delete from Employee where id = :eid"); 
query.setInteger("eid", 4); 
result = query.executeUpdate(); 
System.out.println("Employee deleted successfully " + result); 

tx.commit(); // commit the transaction 
session.close(); // close the session 
factory.close(); // close the factory 
関連する問題