2013-08-30 22 views
6

Hibernateでsession.saveOrUpdate()メソッドを使用してテーブル行を更新しようとしています。Hibernate saveOrUpdateが更新されない

ただし、行を更新することができず、挿入文を生成することで行を更新しようとします。この挿入は、私のDB内のいくつかのnullableでないフィールドのために動作しません。

DAOレイヤに保存するオブジェクトのIDを取得できるため、DBテーブルの対応する行を更新するだけではない理由を理解できません。

Beanクラス:

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メソッド(BaseEntityBeanは、ID、CREATEDBY、などがあります):

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

'employeeMasterBean.id'はnullですか? – mabbas

+0

'employeeMasterBean'がcreatedByを設定しましたか? – Ved

+0

分離されたエンティティを渡しているような音; – Thomas

答えて

1

Beanには(optimistic lockingの)rowVersionプロパティが設定されていないため、デフォルトではNULLになっています。このため、Hibernateはこれを新しいレコードと解釈し、保存していました。

レコードを保存または更新しようとするたびに、バリュー・オブジェクトと対応するBeanに行バージョンを格納することで修正しました。

0

エラーメッセージでは、データベースにはヌルにすることができない列createdbyがあります。

saveOrUpdate()を呼び出すと、誰かがこのプロパティをnullに設定しているため、更新できません。

0

私はCreatedBy列がnotnullとしてDBテーブルに存在するが、あなたのBeanは、この列がマップされていない、あなたがスローされた例外上記の原因saveOrUpdateを行うときに、それ故にnull値が送信されると思います。

デフォルト値を使用してBean内のCreatedByへのマッピングを追加し、let triggerなどがデフォルト値を更新することができます。または、データベースでNULLを許可できるように列を変更できる場合

関連する問題