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;
    }


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

Kommentare werden nicht hinzugefügt

Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
  lamao
advanced
Absenden