【问题标题】:Unable to update table using hibernate spring mvc无法使用休眠 spring mvc 更新表
【发布时间】:2016-04-25 17:03:50
【问题描述】:

我的实体类如下

package com.ibs.entity;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name = "InitialMedicalCheckUpG3")
public class InitialMedicalCheckUpEntity {

    private int imcsId;
    private String empId, status, updatedBy, remarks;
    Date updatedOn;

    @Column(name = "IMCS_ID")
    public int getImcsId() {
        return imcsId;
    }

    public void setImcsId(int imcsId) {
        this.imcsId = imcsId;
    }

    @Id
    @Column(name = "EMP_ID")
    @GeneratedValue(generator = "increment", strategy = GenerationType.AUTO)
    @GenericGenerator(name = "increment", strategy = "increment")
    public String getEmpId() {
        return empId;
    }

    public void setEmpId(String empId) {
        this.empId = empId;
    }

    @Column(name = "STATUS")
    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    @Column(name = "UPDATED_BY")
    public String getUpdatedBy() {
        return updatedBy;
    }

    public void setUpdatedBy(String updatedBy) {
        this.updatedBy = updatedBy;
    }

    @Column(name = "REMARKS")
    public String getRemarks() {
        return remarks;
    }

    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "UPDATED_ON", insertable = false)
    public Date getUpdatedOn() {
        return updatedOn;
    }

    public void setUpdatedOn(Date updatedOn) {
        this.updatedOn = updatedOn;
    }

}

数据访问对象->

package com.ibs.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.ibs.entity.InitialMedicalCheckUpEntity;

@Repository
public class InitialMedicalCheckUpDaoImpl implements InitialMedicalCheckUpDao {

    @Autowired
    SessionFactory sessionFactory;

    @Override
    public List<InitialMedicalCheckUpEntity> getConfirmedList() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public List<InitialMedicalCheckUpEntity> getNonConfirmedList() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void update(InitialMedicalCheckUpEntity e) {
        // TODO Auto-generated method stub
        System.out.println(e.getStatus());
        sessionFactory.getCurrentSession().update(e);
    }

}

Hibernate 为我的更新语句准备了以下查询-> 休眠: 更新 InitialMedicalCheckUpG3 设置 IMCS_ID=?, REMARKS=?,STATUS=?,UPDATED_BY=?, UPDATED_ON=? EMP_ID=?

所以表格没有更新。

我使用服务类中的 Dao-> 包 com.ibs.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.ibs.dao.InitialMedicalCheckUpDao;
import com.ibs.entity.InitialMedicalCheckUpEntity;

@Service
public class InitialMedicalCheckUpServiceImpl implements
    InitialMedicalCheckUpService {

    @Autowired
    InitialMedicalCheckUpDao dao;

    @Override
    public List<InitialMedicalCheckUpEntity> getConfirmedList() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public List<InitialMedicalCheckUpEntity> getNonConfirmedList() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    @Transactional
    public void update(InitialMedicalCheckUpEntity e) {
        // TODO Auto-generated method stub
        dao.update(e);

    }

}

【问题讨论】:

    标签: java spring hibernate spring-mvc


    【解决方案1】:

    通过休眠的每个操作都需要与事务相关联。您需要确保您的更新操作是事务的一部分并且该工作单元已提交。确保您将此操作与事务相关联并提交。

    【讨论】:

    • 在 Spring 中使用 Hibernate 时,最好让 Spring 通过 DAO 类上的 @Transaction 注解来处理事务
    【解决方案2】:

    InitialMedicalCheckUpDaoImpl 类之前或每个方法之前使用@Transactional 注释。然后 Spring 将自动为此类中的所有方法添加事务特征。当您希望拥有可以执行多个 dao 操作的事务时,这有一个缺点。

    更好的设计是拥有另一个类(服务)来调用 dao 中定义的方法。然后可以用@Transactional 注释这个类。这将导致更好的事务定义,因为一些事务可以跨越多个数据库操作,例如插入然后更新。

    编辑

    我刚刚注意到您没有覆盖实体类中的 equals 和 hashcode 方法。 hibernate 需要这些来了解实体在更新之前是否已经在数据库中,实体是否在某个时间点与会话分离或在集合中使用。您可以为此使用 id 字段。

    @Override
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        }
        if (o == null) {
            return false;
        }
        if (!(o instanceof InitialMedicalCheckUpEntity)) {
            return false;
        }
        return this.getEmpId()==o.getEmpId();
    }
    
    @Override
    public int hashCode() {
        return empId;
    }
    

    你可能想看看this Question

    【讨论】:

    • 谢谢。但是我已经有一个服务类并且我使用了@Transactional 注释。我也编辑了我的 qstn 以显示该课程。
    猜你喜欢
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多