Hi Lukasz,

looks strange to me ;-)
You want to map a m:n relation between User and Role, then both
descriptor have to include a collection-descriptor pointing to
indirection table.

http://db.apache.org/ojb/docu/guides/basic-technique.html#Support+for+Non-Decomposed+m%3An+Mappings

Then in your code it seems you want to do insert and link of objects by
hand (delete too?), then you have to set auto-update/delete to NONE

http://db.apache.org/ojb/docu/guides/basic-technique.html#Link+references

or if OJB should do the job set OBJECT.

Please have a look in test suite class M2NTest.java. This class shows the object handling with different auto-xxx settings.

regards,
Armin


Åukasz Grabski wrote:

Hi

I have funny problem with OJB and Collections (m:n relations). Sample servlet code 
(GET metgod):

//-------------------------------------------------------------------
//adding roles
CMSRole admin = new CMSRole("CMS_ADMIN");
CMSRole author = new CMSRole("CMS_AUTHOR");
CMSRole developer = new CMSRole("CMS_DEVELOPER");
CMSRole editor = new CMSRole("CMS_EDITOR");
CMSRole censor = new CMSRole("CMS_CENSOR");
broker.beginTransaction();


    broker.store(admin);
    broker.store(author);
    broker.store(developer);
    broker.store(editor);
    broker.store(censor);

broker.commitTransaction();

//adding user with roles
CMSUser test1 = new CMSUser("test1", "test1");
test1.addRole(new CMSRole("CMS_CENSOR"));
test1.addRole(new CMSRole("CMS_EDITOR"));

broker.beginTransaction();

broker.store(test1);
broker.store(test2);

broker.serviceBrokerHelper().link(test1, true);
broker.serviceBrokerHelper().link(test2, true);

broker.commitTransaction(); out.println("ROLES LIST: \n");

QueryByCriteria rolesQuery = new QueryByCriteria(CMSRole.class, new Criteria());
result = broker.getCollectionByQuery(rolesQuery);
Iterator iter = result.iterator();


while (iter.hasNext()) {
CMSRole rola = (CMSRole)iter.next();
out.println("Role name: " + rola.getRoleName()); }


QueryByCriteria usersQuery = new QueryByCriteria(CMSUser.class);
result = broker.getCollectionByQuery(usersQuery);


Iterator iter2 = result.iterator();

out.println("USERS LIST: \n");

while (iter2.hasNext()) {
CMSUser user = (CMSUser)iter2.next();
out.println("User name: " + user.getUserName());
out.println("Roles count: " + user.getRoles().size() + "\n"); }
//-------------------------------------------------------------------


This code creates few Roles and then creates user with two roles added. And here is a funny part: when database is empty and I'm adding roles and user first time, everything is fine, I get string "Roles count: 2". But when I comment adding roles and user code and refresh page, Roles count is 0. What am I doing wrong ? Here is a part of my repository.xml file:

//-------------------------------------------------------------------

<class-descriptor
    class="org.imeri.cms.ojb.security.CMSRole"
    table="CMS_ROLES"

    <field-descriptor
        name="roleId"
        column="role_id"
        jdbc-type="INTEGER"
        primarykey="true"
        indexed="true"
        autoincrement="true"
    >
        <documentation>Identyfikator wiersza</documentation>
    </field-descriptor>
    <field-descriptor
        name="roleName"
        column="role_name"
        jdbc-type="VARCHAR"
        nullable="false"
        length="50"
    >
        <documentation>Nazwa roli</documentation>
    </field-descriptor>
    <index-descriptor
        name="ROLE_NAME_UNIQUE"
        unique="true"
    >
        <index-column name="role_name"/>
    </index-descriptor>
</class-descriptor>



<class-descriptor
    class="org.imeri.cms.ojb.security.CMSUser"
    table="CMS_USERS"

    <field-descriptor
        name="userId"
        column="user_id"
        jdbc-type="INTEGER"
        primarykey="true"
        indexed="true"
        autoincrement="true"
    >
        <documentation>Identyfikator wiersza</documentation>
    </field-descriptor>
    <field-descriptor
        name="userName"
        column="user_name"
        jdbc-type="VARCHAR"
        nullable="false"
        length="50"
    >
        <documentation>Nazwa uzytkownika</documentation>
    </field-descriptor>
    <field-descriptor
        name="password"
        column="user_password"
        jdbc-type="VARCHAR"
        nullable="false"
        length="50"
    >
        <documentation>Haslo uzytkownika</documentation>
    </field-descriptor>
    <collection-descriptor
        name="roles"
        collection-class="org.apache.ojb.broker.util.collections.ManageableVector"
        element-class-ref="org.imeri.cms.ojb.security.CMSRole"
        indirection-table="USERS_ROLES_KEYS"
        auto-retrieve="true"
        auto-update="link"
        auto-delete="link"
    >
        <fk-pointing-to-this-class column="userId"/>
        <fk-pointing-to-element-class column="roleId"/>
    </collection-descriptor>
    <index-descriptor
        name="USER_NAME_UNIQUE"
        unique="true"
    >
        <index-column name="user_name"/>
    </index-descriptor>
</class-descriptor>

//-------------------------------------------------------------------

Best regards
Lukasz Grabski



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to