複数フィールドの一意の制約を持つ永続クラスがあります。しかし、定義された一意の制約は私には十分ではありません.1つのフィールドでは、等しくないが類似の値も一意であるためです。
メソッドを実装していcheckUniqueConstraint
ます。DAO クラスの add メソッドと update メソッドでは、checkUniqueConstraint
persist オブジェクトを追加または更新する前に呼び出します。
checkUniqueConstraint
メソッドは、SELECTクエリを実行して入力に似たオブジェクトを見つけ、いくつかのものを見つけるチェック例外をスローします。
public class PersistClassDao {
public void checkUniqueConstraint(PersistClass persistObject) throws DuplicateEntityException {
/**
* creating a query string that find persist objects similar to input parameter.
**/
try {
PersistClass result = (PersistClass) query.uniqueResult();
if(result != null && (persistObject.getId() == null || persistObject.getId() != result.getId())){
throw new DuplicateEntityException(exceptionMessage, "");
}
} catch (NonUniqueResultException e) {
throw new DuplicateEntityException(exceptionMessage);
}
}
public long add(/* field of new persistObject*/) throws DuplicateEntityException {
//creates a transisent instance of persistObject
PersistClass newObject = getPersistClass(/* field of new persistObject*/);
checkUniqueConstraint(newObject);
try {
getCurrentSession().save(newObject);
getCurrentSession().flush();
return newObject.getId();
} catch (ConstraintViolationException e) {
throw new DuplicateEntityException();
}
}
追加用のトランザクションサービスメソッドと更新用のトランザクションサービスメソッドがあります。
テストを実行すると
- 最初に 2 つの persistObjects を追加します (サービス メソッドを使用)。
- 次に、(サービスメソッドを介して)一方を更新して、他方と同様になるようにします
- DuplicatException がスローされることを期待しています
しかし、実際には org.hibernate.exception. checkUniqueConstraint によって ConstraintViolationException がスローされます!!
なんで?