2011-11-16 2 views
1

기본 최대 절전 모드 자습서를 따르고 있습니다. 자습서 프로그램은 자습서에 설명 된대로 출력을 표시하는 &을 실행 중이지만 출력 후에 예외를 표시합니다. 이 프로그램은 쓰기, 검색, & 두 개의 MySQL 데이터베이스에서 /에서 값을 삭제합니다.최대 절전 모드 프로그램의 예외

29088 [main] ERROR org.hibernate.jdbc.AbstractBatcher - Exception executing batch: 
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 
    at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:85) 
    at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:70) 
    at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:90) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027) 
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365) 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) 
    at com.hib.Test.deleteUser(Test.java:187) 
    at com.hib.Test.main(Test.java:55) 
Hibernate: delete from users where id=? 
29093 [main] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session 
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 
    at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:85) 
    at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:70) 
    at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:90) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027) 
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365) 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) 
    at com.hib.Test.deleteUser(Test.java:187) 
    at com.hib.Test.main(Test.java:55) 
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 
    at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:85) 
    at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:70) 
    at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:90) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027) 
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365) 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) 
    at com.hib.Test.deleteUser(Test.java:187) 
    at com.hib.Test.main(Test.java:55) 

이 주 프로그램이다
다음은 예외이다.

package com.hib; 

import java.util.Iterator; 
import java.util.List; 
import org.hibernate.Session; 
import org.hibernate.Transaction; 

public class Test { 

/** 
    * @param args 
    */ 
public static void main(String[] args) { 

    Test tst = new Test(); 

    /** 
    * adding records 
    */ 
    tst.addUser("Saranga", "Rath"); 
    tst.addUser("Isuru", "Sampath"); 
    tst.addUser("Saranga", "Jaya"); 
    tst.addUser("Prasanna", "Milinda"); 

    tst.addTask(1, "Call", "Call Pubudu at 5 PM"); 
    tst.addTask(1, "Shopping", "Buy some foods for Kity"); 
    tst.addTask(2, "Email", "Send birthday wish to Pubudu"); 
    tst.addTask(2, "SMS", "Send message to Dad"); 
    tst.addTask(2, "Office", "Give a call to Boss"); 

    /** 
    * retrieving data 
    */ 
    tst.getFullName("Saranga"); 

    /** 
    * full updating records 
    */ 
    User user = new User(); 
    user.setId(1); 
    user.setFirstName("Saranga"); 
    user.setLastName("Rathnayake"); 
    tst.updateUser(user); 

    /** 
    * partial updating records 
    */ 
    tst.updateLastName(3, "Jayamaha"); 

    /** 
    * deleting records 
    */ 
    User user1 = new User(); 
    user1.setId(4); 
    tst.deleteUser(user1); 
} 

private void addUser(String firstName, String lastName) { 

    Transaction trns = null; 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    try { 
    trns = session.beginTransaction(); 

    User user = new User(); 

    user.setFirstName(firstName); 
    user.setLastName(lastName); 

    session.save(user); 

    session.getTransaction().commit(); 
    } catch (RuntimeException e) { 
    if(trns != null){ 
    trns.rollback(); 
    } 
    e.printStackTrace(); 
    } finally{ 
    session.flush(); 
    session.close(); 
    } 
} 

private void addTask(int userID, String title, String description) { 

    Transaction trns = null; 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    try { 
    trns = session.beginTransaction(); 

    Task task = new Task(); 

    task.setUserID(userID); 
    task.setTitle(title); 
    task.setDescription(description); 

    session.save(task); 

    session.getTransaction().commit(); 
    } catch (RuntimeException e) { 
    if(trns != null){ 
    trns.rollback(); 
    } 
    e.printStackTrace(); 
    } finally{ 
    session.flush(); 
    session.close(); 
    } 
} 

private void updateLastName(int id, String lastName) { 
    Transaction trns = null; 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    try { 
    trns = session.beginTransaction(); 
    String hqlUpdate = "update User u set u.lastName = :newLastName where u.id = :oldId"; 
    int updatedEntities = session.createQuery(hqlUpdate) 
    .setString("newLastName", lastName) 
    .setInteger("oldId", id) 
    .executeUpdate(); 

    trns.commit(); 
    } catch (RuntimeException e) { 
    if(trns != null){ 
    trns.rollback(); 
    } 
    e.printStackTrace(); 
    } finally{ 
    session.flush(); 
    session.close(); 
    } 

} 

private void updateUser(User user) { 
    Transaction trns = null; 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    try { 
    trns = session.beginTransaction(); 

    session.update(user); 

    session.getTransaction().commit(); 
    } catch (RuntimeException e) { 
    if(trns != null){ 
    trns.rollback(); 
    } 
    e.printStackTrace(); 
    } finally{ 
    session.flush(); 
    session.close(); 
    } 
} 

private void getFullName(String firstName) { 
    Transaction trns = null; 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    try { 
    trns = session.beginTransaction(); 
    List<User> users = session.createQuery("from User as u where u.firstName = :firstName") 
    .setString("firstName", firstName) 
    .list(); 
    for (Iterator<User> iter = users.iterator(); iter.hasNext();) { 
    User user = iter.next(); 
    System.out.println(user.getFirstName() +" " + user.getLastName()); 
    } 
    trns.commit(); 
    } catch (RuntimeException e) { 
    if(trns != null){ 
    trns.rollback(); 
    } 
    e.printStackTrace(); 
    } finally{ 
    session.flush(); 
    session.close(); 
    } 
} 

private void deleteUser(User user) { 
    Transaction trns = null; 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    try { 
    trns = session.beginTransaction(); 

    session.delete(user); 

    session.getTransaction().commit(); 
    } catch (RuntimeException e) { 
    if(trns != null){ 
    trns.rollback(); 
    } 
    e.printStackTrace(); 
    } finally{ 
    session.flush(); 
    session.close(); 
    } 
} 
} 

HibernateUtil.java

package com.hib; 

import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 

public class HibernateUtil { 
private static final SessionFactory sessionFactory = buildSessionFactory(); 
private static SessionFactory buildSessionFactory() { 
    try { 
    // Create the SessionFactory from hibernate.cfg.xml 
    return new Configuration().configure().buildSessionFactory(); 
    } 
    catch (Throwable ex) { 
    // Make sure you log the exception, as it might be swallowed 
    System.err.println("Initial SessionFactory creation failed." + ex); 
    throw new ExceptionInInitializerError(ex); 
    } 
} 
public static SessionFactory getSessionFactory() { 
    return sessionFactory; 
} 
} 

User.java

package com.hib; 

public class User { 
private Integer id; 
private String firstName; 
private String lastName; 

public Integer getId() { 
    return id; 
} 
public void setId(Integer 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; 
} 
} 

Task.java

package com.hib; 

public class Task { 

private Integer id; 
private Integer userID; 
private String title; 
private String description; 

public Integer getId() { 
    return id; 
} 
public void setId(Integer id) { 
    this.id = id; 
} 
public Integer getUserID() { 
    return userID; 
} 
public void setUserID(Integer userID) { 
    this.userID = userID; 
} 
public String getTitle() { 
    return title; 
} 
public void setTitle(String title) { 
    this.title = title; 
} 
public String getDescription() { 
    return description; 
} 
public void setDescription(String description) { 
    this.description = description; 
} 
} 

답변

3

삭제하거나 행을 업데이트하려고하면이 예외가 발생합니다 존재하지 않습니다.

User user1 = new User(); 
user1.setId(4); 
tst.deleteUser(user1); 

USER1 최대 절전 삭제하도록되어 어떻게 그래서 DB에 지속되지 않습니다 : 는 그리고 이것은 당신이 정확히 무엇입니까?

BTW : 직접 엔티티의 자동 생성 된 PK 값을 설정하지 마십시오. 이는 문제가 있음을 의미합니다. 또한 Task에서 UserID 자체를 사용하여 Task에서 User를 참조하는 것으로 나타났습니다. 기본 키를 사용하는 경우 도메인을 분리하고 싶지만 무의미한 경우 비즈니스 키 (예 : 고유 사용자 이메일 등)를 사용하여 이러한 방식으로 관련되는 것이 좋습니다. Integer userID 대신 User user을 작업에 사용하고 ManyToOne을 사용자로 만듭니다.

관련 문제