2013-08-30 44 views
6

Tôi đang cố gắng cập nhật một hàng bảng bằng cách sử dụng phương thức session.saveOrUpdate() trong Hibernate.Hibernate saveOrUpdate không cập nhật

Tuy nhiên, nó không thể cập nhật hàng và cố gắng lưu nó bằng cách tạo ra một câu lệnh chèn. Chèn này không hoạt động do một vài trường không nullable trong DB của tôi.

Tôi có thể truy xuất Id của đối tượng được lưu ở lớp DAO, vì vậy tôi không thể hiểu tại sao nó không chỉ cập nhật hàng tương ứng trong bảng DB.

Bean Class: (BaseEntityBean có Id, CreatedBy vv)

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 Phương pháp:

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 ngoại lệ debugger ném là:

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

Có phải 'employeeMasterBean.id' không? – mabbas

+0

'employeeMasterBean' đã tạoBởi thiết lập? – Ved

+0

Có vẻ như bạn đang đi qua một thực thể tách rời;) – Thomas

Trả lời

1

Đậu không có thuộc tính rowVersion (cho khóa lạc quan), và do đó theo mặc định nó là rỗng. Hibernate do đó giải thích điều này như một kỷ lục mới, và tiếp tục lưu nó.

Tôi đã sửa nó bằng cách lưu trữ phiên bản hàng trong đối tượng giá trị của tôi và Bean tương ứng bất cứ khi nào tôi cố lưu hoặc cập nhật bất kỳ bản ghi nào.

0

Như thông báo lỗi nói rằng, cơ sở dữ liệu có một cột createdby không thể rỗng.

Khi bạn gọi saveOrUpdate() ai đó đã đặt thuộc tính này thành null để không thể cập nhật.

0

Tôi nghĩ CreatedBy cột có mặt trong bảng DB như notnull nhưng đậu của bạn không có cột này ánh xạ, vì thế một giá trị null được gửi khi bạn làm một saveOrUpdate, gây Trên ngoại lệ được ném ra.

Hoặc thêm ánh xạ vào CreatedBy trong bean của bạn với một số giá trị mặc định và cho phép trình kích hoạt vv có thể cập nhật giá trị mặc định. Hoặc nếu bạn có thể thay đổi cột thành nullable trong cơ sở dữ liệu

Các vấn đề liên quan