У меня есть POJO, сопоставленный с Hibernate для постоянства. В моем отображении я указываю следующее:
<class name="ExpertiseArea">
<id name="id" type="string">
<generator class="assigned" />
</id>
<version name="version" column="VERSION" unsaved-value="null" />
<property name="name" type="string" unique="true" not-null="true" length="100" />
...
</class>
И я хочу проверить, что если я установлю имя длиннее 100 символов, изменение не будет сохранено. У меня есть DAO, где я сохраняю сущность со следующим кодом:
public T makePersistent(T entity){
transaction = getSession().beginTransaction();
transaction.begin();
try{
getSession().saveOrUpdate(entity);
transaction.commit();
}catch(HibernateException e){
logger.debug(e.getMessage());
transaction.rollback();
}
return entity;
}
На самом деле приведенный выше код взят из GenericDAO, от которого наследуются все мои DAO. Затем я создал следующий тест:
public void testNameLengthMustBe100orLess(){
ExpertiseArea ea = new ExpertiseArea(
"1234567890" +
"1234567890" +
"1234567890" +
"1234567890" +
"1234567890" +
"1234567890" +
"1234567890" +
"1234567890" +
"1234567890" +
"1234567890");
assertTrue("Name should be 100 characters long", ea.getName().length() == 100);
ead.makePersistent(ea);
List<ExpertiseArea> result = ead.findAll();
assertEquals("Size must be 1", result.size(),1);
ea.setName(ea.getName()+"1234567890");
ead.makePersistent(ea);
ExpertiseArea retrieved = ead.findById(ea.getId(), false);
assertTrue("Both objects should be equal", retrieved.equals(ea));
assertTrue("Name should be 100 characters long", (retrieved.getName().length() == 100));
}
Объект сохранился в порядке. Затем я установил имя длиной более 100 символов и попытался сохранить изменения, но это не удалось:
14:12:14,608 INFO StringType:162 - could not bind value '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890' to parameter: 2; data exception: string data, right truncation
14:12:14,611 WARN JDBCExceptionReporter:100 - SQL Error: -3401, SQLState: 22001
14:12:14,611 ERROR JDBCExceptionReporter:101 - data exception: string data, right truncation
14:12:14,614 ERROR AbstractFlushingEventListener:324 - Could not synchronize database state with session
org.hibernate.exception.DataException: could not update: [com.exp.model.ExpertiseArea#33BA7E09-3A79-4C9D-888B-4263314076AF]
//Stack trace
14:12:14,615 DEBUG GenericDAO:87 - could not update: [com.exp.model.ExpertiseArea#33BA7E09-3A79-4C9D-888B-4263314076AF]
14:12:14,616 DEBUG JDBCTransaction:186 - rollback
14:12:14,616 DEBUG JDBCTransaction:197 - rolled back JDBC Connection
Это ожидаемое поведение. Однако, когда я получаю постоянный объект, чтобы проверить, все ли его имя имеет длину 100 символов, тест не пройден.
На мой взгляд, найденный объект должен иметь имя длиной 100 символов, если попытка обновления не удалась. Последнее утверждение не выполняется, потому что имя теперь длиной 110 символов, как если бы экземпляр ea
действительно был обновлен.
Что я здесь не так делаю?