我正在尝试使用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
答案 0 :(得分:1)
bean没有设置rowVersion属性(用于乐观锁定),因此默认情况下它为null。因此,Hibernate将此解释为新记录,并继续保存它。
我通过在我尝试保存或更新任何记录时将行版本存储在我的Value Object和相应的Bean中来修复它。
答案 1 :(得分:0)
如错误消息所示,数据库的列createdby
不能为空。
当您致电saveOrUpdate()
时,有人将此属性设置为null
,因此无法进行更新。
答案 2 :(得分:0)
我认为CreatedBy
列在数据库表中显示为notnull
,但您的bean没有映射此列,因此当您执行null
时会发送saveOrUpdate
值},这会导致抛出异常。
使用某个默认值向bean中的CreatedBy
添加映射,并让触发器等更新默认值。或者,如果您可以在数据库