I run into problem with M:N relationship. I have a User class (Korisnik) and
Jobs class (VrstaPosla). User can do several jobs and one type of job can
have zero or more users assotiated with it. I made next repository file for
this:
<!-- Please keep user defined mappings in this file only
to avoid mixing user defined and system mappings. -->
<!-- Mapping of User defined classes starts here -->
<!-- Definitions for com.birosoft.comex.entity.user.Korisnik -->
<class-descriptor
class="com.birosoft.comex.entity.user.Korisnik"
table="DC_USERS"
>
<field-descriptor id="1"
name="korisnickoIme"
column="USERNAME"
jdbc-type="VARCHAR"
primarykey="true"
/>
<field-descriptor id="2"
name="punoIme"
column="FULLNAME"
jdbc-type="VARCHAR"
/>
<collection-descriptor
name="vrstaPosla"
element-class-ref="com.birosoft.comex.entity.user.VrstaPosla"
indirection-table="DC_USERS_JOBS"
>
<fk-pointing-to-this-class column="USERNAME"/>
<fk-pointing-to-element-class column="JOB"/>
>
</collection-descriptor>
</class-descriptor>
<!-- Definitions for com.birosoft.comex.entity.user.VrstaPosla -->
<class-descriptor
class="com.birosoft.comex.entity.user.VrstaPosla"
table="DC_JOBS"
>
<field-descriptor id="1"
name="posao"
column="JOB"
jdbc-type="INTEGER"
primarykey="true"
autoincrement="true"
/>
<field-descriptor id="2"
name="naziv"
column="JOBNAME"
jdbc-type="VARCHAR"
/>
<collection-descriptor
name="korisnici"
element-class-ref="com.birosoft.comex.entity.user.Korisnik"
indirection-table="DC_USERS_JOBS"
>
<fk-pointing-to-this-class column="JOB"/>
<fk-pointing-to-element-class column="USERNAME"/>
>
</collection-descriptor>
</class-descriptor>
<!-- Mapping of User defined classes ends here -->
I have next tables in Hsqldb and data in it:
CREATE TABLE DC_USERS(USERNAME VARCHAR NOT NULL PRIMARY KEY,FULLNAME VARCHAR)
CREATE TABLE DC_JOBS(JOB INTEGER NOT NULL PRIMARY KEY,JOBNAME VARCHAR NOT
NULL)
CREATE TABLE DC_USERS_JOBS(USERNAME VARCHAR NOT NULL,JOB INTEGER NOT
NULL,UNIQUE(USERNAME,JOB))
INSERT INTO DC_USERS VALUES('mikeai','Miroslav')
INSERT INTO DC_JOBS VALUES(1,'Administrator')
INSERT INTO DC_JOBS VALUES(2,'Skladi\u0161tenje')
INSERT INTO DC_JOBS VALUES(3,'Proizvodnja')
INSERT INTO DC_JOBS VALUES(4,'Nabavka')
INSERT INTO DC_JOBS VALUES(5,'Prodaja')
INSERT INTO DC_USERS_JOBS VALUES('mikeai',1)
User class (Korisnik) looks like:
package com.birosoft.comex.entity.user;
import java.io.Serializable;
import java.util.*;
/**
* <p>
*
* </p>
*/
public class Korisnik implements Serializable
{
private String korisnickoIme;
private String punoIme;
private Vector vrstaPosla;
public String getKorisnickoIme() {
return korisnickoIme;
} // end getKorisnickoIme
public void setKorisnickoIme(String _korisnickoIme) {
korisnickoIme = _korisnickoIme;
} // end setKorisnickoIme
public String getPunoIme() {
return punoIme;
} // end getPunoIme
public void setPunoIme(String _punoIme) {
punoIme = _punoIme;
} // end setPunoIme
public Vector getVrstaPosla()
{
return vrstaPosla;
}
public void setVrstaPosla(Vector v)
{
vrstaPosla = v;
}
public void addPosao(VrstaPosla posao) {
vrstaPosla.add(posao);
} // end addPosao
public void removePosao(VrstaPosla posao) {
vrstaPosla.remove(posao);
} // end removePosao
/**
* <p>
* Ispisuje naziv objekta
* </p>
* <p>
*
* @return a String sa nazivom objekta
* </p>
*/
public String toString() {
return this.korisnickoIme+" <"+this.punoIme+">";
} // end toString
} // end Korisnik
Jobs class (VrstaPosla) looks like:
package com.birosoft.comex.entity.user;
import java.io.Serializable;
import java.util.*;
/**
* <p>
*
* </p>
*/
public class VrstaPosla implements Serializable {
///////////////////////////////////////
// attributes
private int posao;
private String naziv;
private Vector korisnici;
///////////////////////////////////////
// methods
public int getPosao() {
return posao;
}
public void setPosao(int _posao) {
posao = _posao;
}
public String getNaziv() {
return naziv;
}
public void setNaziv(String _naziv) {
naziv = _naziv;
}
public Vector getKorisnici() {
return korisnici;
}
public void setKorisnici(Vector v) {
korisnici = v;
}
public String toString() {
/*
switch (posao) {
case SKLADISTENJE: return new String("Skladištenje");
case PROIZVODNJA: return new String("Proizvodnja");
case NABAVKA: return new String("Nabavka");
case PRODAJA: return new String("Prodaja");
} */
return naziv;
}
} // end VrstaPosla
Now what's the problem. I want to be able to remove user from some job. I'm
using next code to change a collection which holds user for job object.
if (this.selectedUserList.getSelectedIndex()>-1)
{
Korisnik k = (Korisnik)
this.selectedUserList.getSelectedValue();
VrstaPosla vp = (VrstaPosla) this.jobsCombo.getSelectedItem();
Vector hu = vp.getKorisnici();
hu.remove(k);
vp.setKorisnici(hu);
this.jobsBean.storeJob(vp);
this.checkLists();
}
When I run this code OJB deletes appropriate record from DC_USERS_JOBS table
but it also deletes a user 'mikeai' from DC_USERS table. Why? I tried to put
into collection descriptor auto-update and auto-delete to false but when run
this code I got user deleted anyway. I'm using now SessionBeans with PBAPI
instead ODMG.
BTW, I'm using db-ojb-rc4 from CVS.
--
Best regards,
Mickey [EMAIL PROTECTED], [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]