HQL неправильно отрабатывает в тестах

 
0
 
Java
ava
lamao | 21.03.2013, 12:15
Есть две сущности 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;
    }


Что здесь не так? Где разница? Потому что я что-то ничего найти не могу...
Comments (0)

Comments are not added

Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  lamao
advanced
Submit