6

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

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

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

Bean Class:(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;
}
} 

道方法:

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
4

4 回答 4

1

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

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

于 2013-09-23T13:18:38.390 回答
1

我认为CreatedBy列存在于 DB 表中,notnull但您的 bean 没有映射此列,因此null当您执行 a 时会发送一个值saveOrUpdate,这会导致引发上述异常。

在您的 bean 中添加一个具有一些默认值的映射 CreatedBy并让触发器等可以更新默认值。或者,如果您可以在数据库中将列更改为可为空

于 2013-08-30T13:02:34.237 回答
1

正如错误消息所说,数据库有一个createdby不能为空的列。

当您打电话saveOrUpdate()给某人时,已将此属性设置为,null因此无法进行更新。

于 2013-08-30T13:00:10.743 回答
0

我们可以将以下内容添加到jsp表单中以匹配实体PK(id),

<form:hidden path="id" />
于 2022-01-12T14:57:33.637 回答