繁体   English   中英

无法使用休眠的Spring MVC更新表

[英]Unable to update table using hibernate spring mvc

我的实体类如下

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为我的更新语句-> Hibernate准备了以下查询:update InitialMedicalCheckUpG3 set IMCS_ID = ?, REMARKS = ?, STATUS = ?, UPDATED_BY = ?, UPDATED_ON =? 其中EMP_ID =?

因此该表未更新。

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

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);

    }

}

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

InitialMedicalCheckUpDaoImpl类之前或每个方法之前使用@Transactional批注。 然后,Spring将自动为此类中的所有方法添加事务特性。 当您要进行的事务可以执行多个操作时,这样做有一个缺点。

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

编辑

我只是注意到您尚未在实体类中覆盖equals和hashcode方法。 休眠需要这些信息来知道实体在更新之前是否已存在于数据库中,该实体是否在某个时候从会话中分离出来或在集合中使用过。 您可以为此使用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;
}

您可能想看看这个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM