public class IssueBean extends AbstractPersistableBean {
private boolean leaf;
// ...
public boolean isLeaf() {
return leaf;
}
void setLeaf(boolean leaf) {
this.leaf = leaf;
}
}
Java Hibernate Formula Problem
У меня проблема с использованием @formula свойства в мапинге.
База данных - MySql
Вот код:
Код:
А вот мапинг к нему:
Код:
<class name="IssueBean" table="issues">
<!--...-->
<property name="leaf"
insert="false"
update="false"
formula="(select count(chld.id)=0 from issues chld where chld.root=id)"
type="boolean"/>
</class>
<!--...-->
<property name="leaf"
insert="false"
update="false"
formula="(select count(chld.id)=0 from issues chld where chld.root=id)"
type="boolean"/>
</class>
Кеш отключен:
Код:
hibernate.current_session_context_class = thread
hibernate.cache.provider_class = org.hibernate.cache.NoCacheProvider
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
hibernate.cache.provider_class = org.hibernate.cache.NoCacheProvider
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
используемый HQL:
Код:
public List<IssueBean> selectForRoot(Long root) {
return executeHQL("from IssueBean issue where issue.root=?",root);
}
return executeHQL("from IssueBean issue where issue.root=?",root);
}
Пока в текущем запуске сервера не произошло inserta все идет нормально. Новые же объекты начинают глючить (leaf устанавливается в true, хотя дожен быть false). При этом если выполнить тот же запрос в каком-нибудь стороннем обозревателе БД - все отрабатывает корректно.
К примеру имеем следующую базу:
Код:
id root
1 0
2 1
3 1
1 0
2 1
3 1
вставляем новую запись и получаем
Код:
id root
1 0
2 1
3 1
4 3
1 0
2 1
3 1
4 3
теперь в том же запуске сервера пытаемся извлечь IssueBean(@id=3)
SQL генерируется Гибернейтом следующий:
Код:
select issuebean0_.id as id3_, issuebean0_.root as root3_, (select count(chld.id)=0 from issues chld where chld.root=issuebean0_.id) as formula0_ from issues issuebean0_ where issuebean0_.root=?
при выполнении с параметром равным 3 в обозревателе базы данных formula0_ возвращается 0, тогда как возвращенный IssueBean(@id=3).leaf=true.