[HIBERNATE] Table de jointure & <composite-element>
Bonjour,
Je tente d'utiliser une jointure de table one-to-many, avec un champ de classement dans ma table de jointure.
Base : MySQL 4.0.15
Mes tables :
Citation:
CREATE TABLE `sequence` (
`seqId` bigint(20) unsigned NOT NULL auto_increment,
`name` varchar(45) NOT NULL default '',
`report` text NOT NULL,
`create` datetime NOT NULL default '0000-00-00 00:00:00',
`typeId` bigint(20) unsigned NOT NULL default '0',
PRIMARY KEY (`seqId`)
) TYPE=MyISAM;
Citation:
CREATE TABLE `seq_jobs` (
`id` int(10) NOT NULL default '0',
`seqId` bigint(20) unsigned NOT NULL default '0',
`jobId` bigint(20) unsigned NOT NULL default '0',
`position` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`seqId`,`jobId`,`id`)
) TYPE=MyISAM ROW_FORMAT=FIXED;
Citation:
CREATE TABLE `job` (
`jobId` bigint(20) unsigned NOT NULL auto_increment,
`script_path` varchar(45) NOT NULL default '',
`params` varchar(45) NOT NULL default '',
PRIMARY KEY (`jobId`)
) TYPE=MyISAM;
Mes fichiers de mappings :
Citation:
<hibernate-mapping package="hibernate.mapping">
<class name="Sequence" table="sequence" catalog="sequenceur">
<id name="id" type="java.lang.Long">
<column name="seqId" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="45" not-null="true" />
</property>
<property name="report" type="java.lang.String">
<column name="report" length="65535" not-null="true" />
</property>
<property name="create" type="java.util.Date">
<column name="create" length="19" not-null="true" />
</property>
<many-to-one name="type" column="typeId" class="Type" />
<set name="jobs" table="seq_jobs" inverse="true" order-by="position">
<key column="seqId" />
<composite-element class="JobSequence">
<parent name="sequence" />
<property name="position" column="position" />
<many-to-one name="job" column="jobId" fetch="select" />
</composite-element>
</set>
</class>
</hibernate-mapping>
Citation:
<hibernate-mapping package="hibernate.mapping">
<class name="Job" table="job" catalog="sequenceur">
<id name="id" type="java.lang.Long">
<column name="jobId" />
<generator class="native"></generator>
</id>
<property name="scriptPath" type="java.lang.String">
<column name="script_path" length="45" not-null="true" />
</property>
<property name="params" type="java.lang.String">
<column name="params" length="45" not-null="true" />
</property>
<set name="sequences" table="seq_jobs" cascade="all">
<key column="jobId" />
<many-to-many class="Sequence" column="seqId" fetch="select" />
</set>
</class>
</hibernate-mapping>
Par contre, je n'ai pas de mapping pour la classe JobSequence comme conseillé dans le livre Hibernate 3.0 de Anthony Patricio chez Eyrolles.
Le code que j'ai est le suivant et est identique à celui proposé dans le bouquin pages 104/105.
Citation:
public class Sequence extends AbstractSequence implements java.io.Serializable {
/...
public void importJob(final Job job) {
Transaction tx = null;
Session session = HibernateSessionFactory.currentSession();
try {
tx = session.beginTransaction();
JobSequence js = new JobSequence();
js.setSequence(this);
js.setJob(job);
js.setPosition(jobs.size() + 1);
this.getSequenceJobs().add(js);
tx.commit();
} catch (HibernateException e) {
e.printStackTrace();
if (tx != null && tx.isActive())
tx.rollback();
} finally {
try {
session.close();
} catch (HibernateException he) {
// TODO: handle exception
}
}
}
}
Merci d'avance pour votre aide.
Ps: je ne suis pas un expert.