Есть две сущности Section & Branch. Section.java | Код | public class Section extends Entity { .............. private Integer position;
private List<Branch> branches = new ArrayList<Branch>(); ................... }
|
Branch.java | Код | public class Branch extends org.jtalks.common.model.entity.Branch implements SubscriptionAwareEntity {
....... }
public class Branch extends Entity { // org.jtalks.common.model.entity.Branch
....................... private Integer position; private Section section; ..................... }
|
Section.hbm.xml | Код | <hibernate-mapping package="org.jtalks.jcommune.model.entity" auto-import="false"> <class name="org.jtalks.common.model.entity.Section" table="SECTIONS"> <cache usage="nonstrict-read-write" region="org.jtalks.EHCOMMON"/> <id column="SECTION_ID" name="id" unsaved-value="0"> <generator class="native"/> </id>
<property column="UUID" name="uuid" unique="true" not-null="true"/> <property name="name" column="NAME" not-null="true"/> <property name="description" column="DESCRIPTION"/> <property name="position" column="POSITION"/>
<list name="branches" cascade="all-delete-orphan"> <cache usage="nonstrict-read-write"/> <key column="SECTION_ID" foreign-key="FK_SECTION"/> <index column="POSITION"/> <one-to-many class="Branch"/> </list> </class>
</hibernate-mapping>
|
Branch.hbm.xml | Код | <hibernate-mapping package="org.jtalks.jcommune.model.entity" auto-import="false"> <class name="org.jtalks.common.model.entity.Branch" table="BRANCHES"> <cache usage="nonstrict-read-write" region="org.jtalks.EHCOMMON"/> <id column="BRANCH_ID" name="id" unsaved-value="0"> <generator class="native"/> </id>
<!-- Used to make dummy hibernate hierarchy used in distributed cache. --> <discriminator> <formula>'BRANCH'</formula> </discriminator>
<property column="UUID" name="uuid" unique="true" not-null="true"/> <property name="name" column="NAME" not-null="true"/> <property name="description" column="DESCRIPTION"/> <property name="position" column="POSITION"/>
<many-to-one name="moderatorsGroup" column="MODERATORS_GROUP_ID" class="org.jtalks.common.model.entity.Group" not-null="false"/>
<many-to-one name="section" column="SECTION_ID" class="org.jtalks.common.model.entity.Section" not-null="false"/>
<subclass name="org.jtalks.jcommune.model.entity.Branch" extends="org.jtalks.common.model.entity.Branch" discriminator-value="BRANCH"> <bag name="topics" cascade="all-delete-orphan" order-by="sticked DESC, modificationDate DESC"> <!--No caching here, see JC-378--> <key column="BRANCH_ID" foreign-key="FK_BRANCH"/> <one-to-many class="Topic"/> </bag>
<set name="subscribers" table="BRANCH_SUBSCRIPTIONS" cascade="all"> <cache usage="nonstrict-read-write"/> <key column="BRANCH_ID"/> <many-to-many column="USER_ID" class="org.jtalks.jcommune.model.entity.JCUser"/> </set> <many-to-one name="lastPost" column="LAST_POST" class="org.jtalks.jcommune.model.entity.Post" /> </subclass> </class>
<query name="getAllBranches"> <![CDATA[FROM org.jtalks.jcommune.model.entity.Branch b ORDER BY b.section.position ASC, b.position ASC]]> </query> </hibernate-mapping>
|
Само по себе работает все как надо. При получении веток они сортируются по указаным критериям правильно. Но в тестах почему-то установленное значение Branch.position игнорируется и считается, что у всех позиция одинаковая. Т.е. по факту они сортируются в порядке добавления. При этом там же сортировка по b.section.position работает правильно. Код теста следующий | Код | private List<Branch> createAndSaveBranchList(int size, int sectionPosition) { List<Branch> branches = new ArrayList<Branch>(); Section section = ObjectsFactory.getDefaultSection(); section.setPosition(sectionPosition); for (int i = 0; i < size; i++) { Branch newBranch = new Branch("Branch #" + i, "Branch #" + i); newBranch.setPosition(size - i - 1); section.addOrUpdateBranch(newBranch); newBranch.setSection(section); branches.add(newBranch); } session.save(section); return branches; }
@Test public void testGetAllBranches() { int sectionSize = 5; createAndSaveBranchList(sectionSize, 1); createAndSaveBranchList(sectionSize, 0);
List<Branch> branches = dao.getAllBranches();
assertEquals(sectionSize * 2, branches.size()); Branch lastBranch = null; for (Branch branch : branches) { if (lastBranch != null) { // вот здесь валится, т.к. позиции бранчей почему-то 4 и 3, а не 0 и 1. assertTrue(branch.getPosition() >= lastBranch.getPosition() || branch.getSection().getPosition() > lastBranch.getSection().getPosition()); assertTrue(branch.getSection().getPosition() >= lastBranch.getSection().getPosition()); } lastBranch = branch; } }
|
а метод в ДАО выглядит так | Код | @SuppressWarnings("unchecked") @Override public List<Branch> getAllBranches() { List<Branch> branches = getSession() .getNamedQuery("getAllBranches") .list(); return branches; }
|
Что здесь не так? Где разница? Потому что я что-то ничего найти не могу...
|