Я пытаюсь протестировать отображения Hibernate, в частности, уникальное ограничение. Мой POJO отображается следующим образом:
<property name="name" type="string" unique="true" not-null="true" />
Что я хочу сделать, это проверить, что я не могу сохранить две сущности с одинаковыми именами:
public class ExpertiseAreaDAOTest{
private ExpertiseAreaDAO ead;
static Connection c;
private static SessionFactory sessionFactory;
static {
Configuration config = new Configuration().configure("resources/exp/hibernate-test.cfg.xml");
sessionFactory = config.buildSessionFactory();
}
@Test(expected=ConstraintViolationException.class)
public void testPersistTwoExpertiseAreasWithTheSameNameIsNotAllowed(){
ExpertiseArea ea = new ExpertiseArea("Design");
ExpertiseArea otherEA = new ExpertiseArea("Design");
ead.setSession(getSessionFactory().getCurrentSession());
ead.getSession().beginTransaction();
ead.makePersistent(ea);
ead.makePersistent(otherEA);
ead.getSession().getTransaction().commit();
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
}
//Other methods ommited
После совершения текущей транзакции я вижу в журналах, что выбрасывается ConstraintViolationException
:
16:08:47,571 DEBUG SQL:111 - insert into ExpertiseArea (VERSION, name, id) values (?, ?, ?)
Hibernate: insert into ExpertiseArea (VERSION, name, id) values (?, ?, ?)
16:08:47,571 DEBUG SQL:111 - insert into ExpertiseArea (VERSION, name, id) values (?, ?, ?)
Hibernate: insert into ExpertiseArea (VERSION, name, id) values (?, ?, ?)
16:08:47,572 WARN JDBCExceptionReporter:100 - SQL Error: -104, SQLState: 23505
16:08:47,572 ERROR JDBCExceptionReporter:101 - integrity constraint violation: unique constraint or index violation; SYS_CT_10036 table: EXPERTISEAREA
16:08:47,573 ERROR AbstractFlushingEventListener:324 - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
Таким образом, я ожидаю, что тест пройдёт, поскольку выдается ожидаемое исключение ConstraintViolationException. Тем не менее, тест никогда не завершается (ни проходит, ни терпит неудачу), и я должен вручную убить бегуна теста.
Как правильно это проверить?