2012-04-30 3 views
0

У меня есть лиги, и каждая лига может иметь любое количество соревнований. Я использую файлы .hbm.xml, чтобы установить связь между лигами и соревнованиями. Я настроил его следующим образом:Конфигурация Hibernate: многие-ко-многим ассоциации

<set name="competitions" table="leagueCompetitions" lazy="false"> 
    <meta attribute="property-type"><![CDATA[Set<Competition>]]></meta> 
    <meta attribute="default-value"><![CDATA[new HashSet<Competition>()]]></meta> 
    <key column="leagueId"/> 
    <many-to-many column="competitionId" 
      unique="true" 
      lazy="false" 
      class="com.example.model.Competition"/> 
</set> 

У меня есть метод DAO, который извлекает список лиг, которые по существу сводятся к

Query query = session.createQuery("from League"); 
return query.list(); 

Я написал код для подсчета соревнований, и это было так же как

if (league.getCompetitions().size() > 0) { ... blahditty blah ... } 

Но это не получилось, потому что getCompetitions() всегда является пустым набором.

Вопрос: Когда я использую LeagueDAO.list(), чтобы получить список лиг, не должна ли каждая лига загружать все свои соревнования?

ответ

1

Оказывается, что моя конфигурация hbm.xml недействителен. У меня была конфигурация «много-ко-многим» на одной таблице и много-к-одному на противоположной стороне ассоциации. Результат был просто беспорядок.

2

Добавить каскад = "все"

<set name="competitions" table="leagueCompetitions" lazy="false" cascade="all"> 
<meta attribute="property-type"><![CDATA[Set<Competition>]]></meta> 
<meta attribute="default-value"><![CDATA[new HashSet<Competition>()]]></meta> 
<key column="leagueId"/> 
<many-to-many column="competitionId" 
     unique="true" 
     lazy="false" 
     class="com.example.model.Competition"/> 

+0

Спасибо, но, похоже, не имеет никакого отношения к поведению гиберната. И [я читал ранее] (https://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies), чем «select» является значением по умолчанию. – Marvo

+0

Также вы можете сохранить его без cacade = «all», я думаю, вы должны получать исключение, например, «ссылки на объекты несохраненного экземпляра переходного процесса» - сохранить временный экземпляр перед промывкой » – mprabhat

+0

Это тоже не работает. – Marvo