Java Spring Hibernate事务:未保存数据

Java Spring Hibernate事务:未保存数据,java,spring,hibernate,transactions,spring-transactions,Java,Spring,Hibernate,Transactions,Spring Transactions,我创建了一个简单的spring应用程序,其中有一个accounts表,其中包含帐号(主键)、帐户类型和余额 当我尝试更新未发生的数据时,它仍然显示旧值 这是我的配置文件 com/jlcindia/spring/Account.hbm.xml org.hibernate.dialogue.mysqldialogue 真的 更新 存款函数的代码段 public void deposit(int accno, double amt) { TransactionDefinition txDe

我创建了一个简单的spring应用程序,其中有一个accounts表,其中包含帐号(主键)、帐户类型和余额

当我尝试更新未发生的数据时,它仍然显示旧值

这是我的配置文件


com/jlcindia/spring/Account.hbm.xml
org.hibernate.dialogue.mysqldialogue
真的
更新
存款函数的代码段

public void deposit(int accno, double amt) {
    TransactionDefinition txDef= new DefaultTransactionDefinition();
    TransactionStatus ts= txManager.getTransaction(txDef);
    Account acc=htemp.load(Account.class,accno,LockMode.READ);
    double cbal=acc.getBal();       
    acc.setBal(cbal+amt);
    htemp.update(acc);
    txManager.commit(ts);       
}
import org.hibernate.LockMode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

public class HibernateAccountDAO implements AccountDAO{

@Autowired
HibernateTemplate htemp=null;

@Autowired
HibernateTransactionManager txManager=null;

@Override
public void deposit(int accno, double amt) {
    TransactionDefinition txDef= new DefaultTransactionDefinition();
    TransactionStatus ts= txManager.getTransaction(txDef);
    Account acc=htemp.load(Account.class,accno,LockMode.READ);
    double cbal=acc.getBal();
    //int cbal=(int)bal;

    acc.setBal(cbal+amt);
    htemp.update(acc);      
    txManager.commit(ts);
    //System.out.println("Acc get Account number "+acc.getAccno());
    //System.out.println("Acc get Account type "+acc.getAtype());
    //System.out.println("Acc get Balance "+acc.getBal());
}


@Override
public void withdraw(int accno, double amt) {
    TransactionDefinition txDef= new DefaultTransactionDefinition();
    TransactionStatus ts= txManager.getTransaction(txDef);
    Account acc=htemp.load(Account.class,accno,LockMode.READ);
    double cbal=acc.getBal();
    if(cbal>500+amt){
        acc.setBal(cbal-amt);
        htemp.update(acc);          
    }else{
        throw new InSufficientFundsException();         
    }
    txManager.commit(ts);

}

@Override
public void fundsTransfer(int saccno, int daccno, double amt) {
    TransactionDefinition txDef= new DefaultTransactionDefinition();
    TransactionStatus ts= txManager.getTransaction(txDef);
    try{
    Account acc1=htemp.load(Account.class,daccno,LockMode.READ);
    double dcbal=acc1.getBal();
    acc1.setBal(dcbal+amt);
    htemp.update(acc1);

    Account acc2=htemp.load(Account.class,saccno,LockMode.READ);
    double scbal=acc2.getBal();
    if(scbal>=500+amt){
        acc2.setBal(scbal-amt);         
        htemp.update(acc2);
    }else{
        throw new InSufficientFundsException();
    }
    txManager.commit(ts);

    }catch(Exception e){
        txManager.rollback(ts);
        e.printStackTrace();
    }
}

@Override
public double getBalance(int accno) {
    TransactionDefinition txDef= new DefaultTransactionDefinition();
    TransactionStatus ts= txManager.getTransaction(txDef);
    Account acc=htemp.load(Account.class,accno,LockMode.READ);
    double cbal=acc.getBal();
    return cbal;        
}
最初,我的表包含以下记录:

账户余额
无类型
账户1:101南非1000
账户2:102 SA 2000
账户3:103 CA 3000
现在更新数据。也就是说,在存放数据后,它仍然显示相同的余额。 为什么会有这样的行为?请解释一下

更新:

类包含存款函数

public void deposit(int accno, double amt) {
    TransactionDefinition txDef= new DefaultTransactionDefinition();
    TransactionStatus ts= txManager.getTransaction(txDef);
    Account acc=htemp.load(Account.class,accno,LockMode.READ);
    double cbal=acc.getBal();       
    acc.setBal(cbal+amt);
    htemp.update(acc);
    txManager.commit(ts);       
}
import org.hibernate.LockMode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

public class HibernateAccountDAO implements AccountDAO{

@Autowired
HibernateTemplate htemp=null;

@Autowired
HibernateTransactionManager txManager=null;

@Override
public void deposit(int accno, double amt) {
    TransactionDefinition txDef= new DefaultTransactionDefinition();
    TransactionStatus ts= txManager.getTransaction(txDef);
    Account acc=htemp.load(Account.class,accno,LockMode.READ);
    double cbal=acc.getBal();
    //int cbal=(int)bal;

    acc.setBal(cbal+amt);
    htemp.update(acc);      
    txManager.commit(ts);
    //System.out.println("Acc get Account number "+acc.getAccno());
    //System.out.println("Acc get Account type "+acc.getAtype());
    //System.out.println("Acc get Balance "+acc.getBal());
}


@Override
public void withdraw(int accno, double amt) {
    TransactionDefinition txDef= new DefaultTransactionDefinition();
    TransactionStatus ts= txManager.getTransaction(txDef);
    Account acc=htemp.load(Account.class,accno,LockMode.READ);
    double cbal=acc.getBal();
    if(cbal>500+amt){
        acc.setBal(cbal-amt);
        htemp.update(acc);          
    }else{
        throw new InSufficientFundsException();         
    }
    txManager.commit(ts);

}

@Override
public void fundsTransfer(int saccno, int daccno, double amt) {
    TransactionDefinition txDef= new DefaultTransactionDefinition();
    TransactionStatus ts= txManager.getTransaction(txDef);
    try{
    Account acc1=htemp.load(Account.class,daccno,LockMode.READ);
    double dcbal=acc1.getBal();
    acc1.setBal(dcbal+amt);
    htemp.update(acc1);

    Account acc2=htemp.load(Account.class,saccno,LockMode.READ);
    double scbal=acc2.getBal();
    if(scbal>=500+amt){
        acc2.setBal(scbal-amt);         
        htemp.update(acc2);
    }else{
        throw new InSufficientFundsException();
    }
    txManager.commit(ts);

    }catch(Exception e){
        txManager.rollback(ts);
        e.printStackTrace();
    }
}

@Override
public double getBalance(int accno) {
    TransactionDefinition txDef= new DefaultTransactionDefinition();
    TransactionStatus ts= txManager.getTransaction(txDef);
    Account acc=htemp.load(Account.class,accno,LockMode.READ);
    double cbal=acc.getBal();
    return cbal;        
}

}

您似乎没有提供会话工厂来休眠模板和事务管理器。请尝试通过修改特定的xml部分再次进行测试,如下所示:


我的模拟代码段:

Resource r=new ClassPathResource("applicationContext.xml");  
BeanFactory factory=new XmlBeanFactory(r);  
HibernateTemplate template = (HibernateTemplate) factory.getBean("template");
HibernateTransactionManager txManager = (HibernateTransactionManager) factory.getBean ("txManager");
TransactionDefinition txDef= new DefaultTransactionDefinition();
TransactionStatus ts= txManager.getTransaction(txDef);
Employee acc=template.load(Employee.class,114,LockMode.READ);      
acc.setName("varun");
template.update(acc);
txManager.commit(ts);

感谢您的关注,我实施了上述建议。但它仍然给出了相同的结果。也就是说,数据仍未保存。如果您的会话工厂bean被称为
sessionFactory
Hibernate,它将自动获取。只有当你的bean被称为不同的东西时,你才必须指定它。@JamesMassey,好的,我的问题仍然存在,你知道如何克服它吗。不,我只使用Hibernate 4。@JamesMassey,谢谢编辑建议和会话工厂的信息。