3

I have a class and 2 many-to-one mappings in it , How can I lazy load them

My properties

**teneo.mapping.also_map_as_class=true
teneo.mapping.set_proxy=true
teneo.mapping.mapping_file_name=/lazy.hbm.xml**

Mapping file ( lazy.hbm.xml)

<class name="EnvironmentImpl" entity-name="**Environment**" abstract="false" lazy="true" discriminator-value="Environment" table="`ENVIRONMENT`" proxy="Environment">
    <meta attribute="eclassName">Environment</meta>

    <property name="name" lazy="false" insert="true" update="true" not-null="true" unique="false" type="java.lang.String">
        <column not-null="true" unique="false" name="`NAME`"/>
    </property>

    <property name="description" lazy="false" insert="true" update="true" not-null="false" unique="false" type="java.lang.String">
        <column not-null="false" unique="false" name="`DESCRIPTION`" length="512"/>
    </property>

    <property name="contact" lazy="false" insert="true" update="true" not-null="false" unique="false" type="java.lang.String">
        <column not-null="false" unique="false" name="`CONTACT`"/>
    </property>

    <many-to-one  name="rootAppFolder" entity-name="ApplicationFolder" lazy="proxy" cascade="all" foreign-key="ENVIRONMENT_ROOTAPPFOLDER" insert="true" update="true" not-null="false" unique="true">
        <column not-null="false" unique="false" name="`APPLICATINFLDER_RTAPPFOLDER_ID`"/>
    </many-to-one>

    <many-to-one name="serviceVirtualization" entity-name="ServiceVirtualization" lazy="proxy" cascade="all" foreign-key="ENVIRNMENT_SERVICEVIRTALIZATIN" insert="true" update="true" not-null="false">
        <column not-null="false" unique="false" name="`SRVCVRTLZTN_SRVICVIRTLIZTIN_ID`"/>
    </many-to-one>
</class>

As you can see class Environment has 2 many-to-one's with names ApplicationFolder and serviceVirtualization.

for a HQL query like -  from Environment where name = :name


    Which internally triggers 3 queries  
    Query1 : Environment ( this is right)

    Query2 : ApplicationFolder ( wrong.lazy loading should not.)

    Query 3 : serviceVirtualization ( wrong.lazy loading should not.)



            DEBUG - select environmen0_."NAME" as NAME4_31_, environmen0_."DESCRIPTION" as DESCRIPT5_31_, environmen0_."CONTACT" as CONTACT6_31_, environmen0_."APPLICATINFLDER_RTAPPFOLDER_ID" as APPLICAT7_31_, environmen0_."SRVCVRTLZTN_SRVICVIRTLIZTIN_ID" as SRVCVRTL8_31_ from "ENVIRONMENT" environmen0_ where environmen0_."NAME"=?

            DEBUG - select applicatio0_.e_id as e1_43_0_, applicatio0_.version_ as version3_43_0_, applicatio0_."NAME" as NAME4_43_0_, applicatio0_."ENVIRONMENT_ENV_E_ID" as ENVIRONM5_43_0_ as APPLICAT8_43_0_ from "APPLICATIONFOLDER" applicatio0_ where applicatio0_.e_id=?

            DEBUG - select servicevir0_.e_id as e1_35_0_, servicevir0_.version_ as version3_35_0_, servicevir0_.econtainer_class as econtainer4_35_0_, servicevir0_.e_container as e5_35_0_, servicevir0_.e_container_featureid as e6_35_0_ from "SERVICEVIRTUALIZATION" servicevir0_ where servicevir0_.e_id=?

What approaches I tried so far 1) set lazy="no-proxy" , dont see any change in number of queries.

2) setting not-found="exception".

3)outer-join = "auto"

Can any one suggest me a solution to reduce those 2 extra queries getting fired because of the eager many-to-one relations ?

Please take a note of the foreign key relationships on many-to-one.

1 Answer 1

3

lazy is true by default. try getting rid of lazy="proxy".

reasons for lazy not working:

  • when the referenced type can not be proxied because there is no default constructor or final methods
  • the referenced type is mapped with <class lazy="false"
Sign up to request clarification or add additional context in comments.

2 Comments

We cannot set lazy="true" on a many-to-one. org.xml.sax.SAXParseException: Attribute "lazy" with value "true" must have a value from the list "false proxy no-proxy ". I tried "no-proxy" but still the problem of eager loading persists.All my referenced types has lazy="true"
do you access the references somewhere in equals or gethashcode maybe?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.