Hibernate saveOrUpdate不会更新

时间:2013-08-30 12:37:58

标签: java hibernate

我正在尝试使用Hibernate中的session.saveOrUpdate()方法更新表行。

但是,它无法更新行并尝试通过生成insert语句来保存它。由于我的数据库中有一些不可为空的字段,此插入不起作用。

我能够检索要在DAO层保存的对象的Id,所以我无法理解为什么它不只是更新数据库表中的相应行。

Bean类:( BaseEntityBean具有Id,CreatedBy等)

public class EmployeeMasterBean extends BaseEntityBean {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Column(name = "FirstName", nullable = false)
private String firstName;

@Column(name = "LastName", nullable = false)
private String lastName;

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "Dob", insertable = true, updatable = true, nullable = false)
private Date dateOfBirth;

@Column(name = "Email", length = 100)
private String email;

@Column(name = "PhoneNumber", nullable = false)
private String phoneNumber;

@Column(name = "Address1", nullable = false)
private String address1;

@Column(name = "Type", nullable = false)
private Short employeeType;

@Column(name = "Gender", nullable = false)
private Short gender;


/**
 * @return the firstName
 */
public final String getFirstName() {
    return firstName;
}

/**
 * @param firstName the firstName to set
 */
public final void setFirstName(String firstName) {
    this.firstName = firstName;
}

/**
 * @return the lastName
 */
public final String getLastName() {
    return lastName;
}

/**
 * @param lastName the lastName to set
 */
public final void setLastName(String lastName) {
    this.lastName = lastName;
}

/**
 * @return the dateOfBirth
 */
public final Date getDateOfBirth() {
    return dateOfBirth;
}

/**
 * @param dateOfBirth the dateOfBirth to set
 */
public final void setDateOfBirth(Date dateOfBirth) {
    this.dateOfBirth = dateOfBirth;
}

/**
 * @return the email
 */
public final String getEmail() {
    return email;
}

/**
 * @param email the email to set
 */
public final void setEmail(String email) {
    this.email = email;
}

/**
 * @return the phoneNumber
 */
public final String getPhoneNumber() {
    return phoneNumber;
}

/**
 * @param phoneNumber the phoneNumber to set
 */
public final void setPhoneNumber(String phoneNumber) {
    this.phoneNumber = phoneNumber;
}

/**
 * @return the address1
 */
public final String getAddress1() {
    return address1;
}

/**
 * @param address1 the address1 to set
 */
public final void setAddress1(String address1) {
    this.address1 = address1;
}

/**
 * @return the employeeType
 */
public final Short getEmployeeType() {
    return employeeType;
}

/**
 * @param employeeType the employeeType to set
 */
public final void setEmployeeType(Short employeeType) {
    this.employeeType = employeeType;
}


/**
 * @return the gender
 */
public final Short getGender() {
    return gender;
}

/**
 * @param gender the gender to set
 */
public final void setGender(Short gender) {
    this.gender = gender;
}
} 

DAO方法:

public EmployeeMasterBean saveOrUpdateEmployee(EmployeeMasterBean employeeMasterBean)  throws Exception{
    Session session = null;
    Transaction tx = null;

    try {
        session = HibernateUtil.getSessionFactory().openSession();
        tx = session.beginTransaction();

        session.saveOrUpdate(employeeMasterBean);

        tx.commit();
    } finally {
        session.close();
    }
    return employeeMasterBean;
}

抛出的Eclipse调试器异常是:

could not insert: [com.indven.gpil.hrd.entity.EmployeeMasterBean]
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'CreatedBy' cannot be null

3 个答案:

答案 0 :(得分:1)

bean没有设置rowVersion属性(用于乐观锁定),因此默认情况下它为null。因此,Hibernate将此解释为新记录,并继续保存它。

我通过在我尝试保存或更新任何记录时将行版本存储在我的Value Object和相应的Bean中来修复它。

答案 1 :(得分:0)

如错误消息所示,数据库的列createdby不能为空。

当您致电saveOrUpdate()时,有人将此属性设置为null,因此无法进行更新。

答案 2 :(得分:0)

我认为CreatedBy列在数据库表中显示为notnull,但您的bean没有映射此列,因此当您执行null时会发送saveOrUpdate值},这会导致抛出异常。

使用某个默认值向bean中的CreatedBy添加映射,并让触发器等更新默认值。或者,如果您可以在数据库

中将列更改为可为空