-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 
Author Message
 Post subject: Multilinguisme sans utilisation d'UserType
PostPosted: Sun Jul 03, 2005 10:02 am 
Newbie

Joined: Sun Jul 03, 2005 9:45 am
Posts: 3
Bonjour,

je souhaite stocker des données en multilingue et ceci de manière assez standard, c'est à dire réutilisable dans le futur.

J'ai donc statué sur une structure de table "label" qui est la suivante :
- label_id : int
- lang : varchar
- label : varchar
La clé est une clé composite (label_id, lang).

Je souhaite utiliser cette structure pour stocker dans un premier temps le nom d'un item, voici les attributs d'un objet item :
- item_id : int
- activated : string
- state : string
- names ????

Lorsque je fais un getName sur un objet item, je veux récupérer le nom de l'item dans toutes les langues (un Set d'objets Label par ex ...).

J'ai une solution qui fonctionne mais qui necessite de creer une table intermédiaire. Pas vraiment satisfaisant ... Si je veux réutiliser la structure Label pour d'autres objets multilingue, je serai alors obligé de créer une table intermédiaire à chaque fois.

Ma question est donc :
Comment déclarer cette relation (c'est du one-to-many) sans modifier la structure de Label ?

Merci d'avance pour vos réponses.

Dany


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jul 04, 2005 2:04 am 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
il n'y a pas de pb, pkoi penses tu necessaire d'avoir n tables label?

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
 Post subject: Plus précisément ...
PostPosted: Sat Jul 16, 2005 3:48 pm 
Newbie

Joined: Sun Jul 03, 2005 9:45 am
Posts: 3
Re-Bonjour,

je réexplique mon pb : j'ai une table label à laquelle je ne peux pas toucher en terme de structure :
- id : PK
- label_id
- lang
- label
(Je peux tout aussi bien faire de (label_id, lang) une clé primaire composite, ca ne change pas grand chose au pb)

Je veux utiliser cette table pour stocker des libellés en multilingue. Par exemple, j'ai un objet "item" qui a un nom et une description, il a une structure comme suit :
- id : PK
- names (en multilingue)
- descriptions (en multilingue)
ce qui donnerait en strcture de table :
- id : PK
- name_label_id : FK(label.label_id)
- description_label_id : FK(label.label_id)

Maintenant, comment déclarer les relations entre ces 2 objets : relations one-to-many ? component ? map ? UserType ?

En prenant la premiere option, j'ai fait un fichier de mapping Label.hbm.xml comme suit :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.clock.hib.Label" table="label">
<id
name="id"
column="id"
type="java.lang.Long"
>
<generator class="native">
</generator>
</id>
<property
name="label_id"
type="java.lang.Long"
column="label_id"
/>
<property
name="lang"
type="java.lang.String"
column="lang"
/>
<property
name="label"
type="java.lang.String"
column="label"
/>
</class>
</hibernate-mapping>

Et pour Item, un fichier de mappng :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

<class name="com.clock.hib.Item" table="item" >
<id
name="id"
column="id"
type="java.lang.Long"
>
<generator class="native">
</generator>
</id>
<set name="names">
<key column="label_id" />
<one-to-many class="com.clock.hib.Label" />
</set>
<set name="descriptions">
<key column="label_id" />
<one-to-many class="com.clock.hib.Label" />
</set>
</class>
</hibernate-mapping>

Ca ne fonctionne pas et à la limite, c compréhensible, je ne vois pas comment le système peut générer un identifiant pour label_id qui soit unique.


Juste pour rappel, je veux que la définition de la relation soit suffisamment générique pour que je puisse réutiliser cette classe label pour gérer le nom d'un objet Category par exemple....

Merci d'avance pour votre aide.

Cordialement,

DL


Top
 Profile  
 
 Post subject:
PostPosted: Thu Feb 16, 2006 10:43 am 
Newbie

Joined: Fri Dec 09, 2005 5:16 am
Posts: 5
J'ai le même problème que toi.
Comment géré le mutlilinguisme en base avec hibernate ?


Par exemple comment mapper mon objet catalogue pour obtenir le libellé de ce dernier dans la langue souhaitée ?


-- CATALOGUES (Table)
CREATE TABLE TCCTLP00

(

CATNAM VARCHAR2(10) not null,

CTLBID number(38) not null,

constraint TCCTNP00 primary key (CATNAM)
using index tablespace INDEX_TBS

);


comment on table TCCTLP00 is 'declaration des catalogue';
comment on column TCCTLP00.CATNAM is 'nom d un catalogue';
comment on column TCCTLP00.CTLBID is 'id du libelle long du catalogue';

-- LIBELLE (Table)

CREATE TABLE TCLIBP00
(

LIBID number(38) not null,

ISOLG varchar2(2) not null,

LIBEL varchar2(255) not null,

constraint TCLIBP00 primary key (LIBID, ISOLG)

using index tablespace INDEX_TBS

);


comment on table TCLIBP00 is 'table des libelles internationalises';
comment on column TCLIBP00.LIBID is 'id libelle';
comment on column TCLIBP00.ISOLG is 'code ISO de la langue du libelle';
comment on column TCLIBP00.LIBEL is 'texte du libelle ';


Top
 Profile  
 
 Post subject:
PostPosted: Fri Feb 17, 2006 6:20 am 
Newbie

Joined: Fri Dec 09, 2005 5:16 am
Posts: 5
Queqlues précisions sur mon mapping :


Catalogue :

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>

<class name="com.cylande.service.test.Catalogue" table="TCCTLP00">
<id name="uid" column="CATNAM" type="java.lang.String">
<generator class="assigned" />
</id>

<many-to-one name="libelle" column="CTLBID" class="com.cylande.service.test.Libelle" unique="true"/>

</class>

</hibernate-mapping>


Libelle :
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>

<class name="com.cylande.service.test.Libelle" table="TCLIBP00">

<composite-id>
<key-property name="uid" type="long" column="LIBID"/>
<key-property name="codeIso" type="string" column="ISOLG"/>
</composite-id>

<property name="lib" column="LIBEL"/>

</class>

</hibernate-mapping>


Classe Catalogue :
/*
* Créé le 17 févr. 2006
*/
package com.cylande.service.test;

import java.io.Serializable;

/**
* @author sberthod
*/

public class Catalogue implements Serializable{


private String uid=null;
private Libelle libelle =null;


public String getLib() {
if (libelle!=null)
return libelle.getLib();
else
return "libelle inconnu";
}


public String getUid() {
return uid;
}
public void setUid(String string) {
uid = string;
}
public Libelle getLibelle() {
return libelle;
}
public void setLibelle(Libelle libelle) {
this.libelle = libelle;
}

}

Classe Libelle :
/*
* Créé le 17 févr. 2006
*/
package com.cylande.service.test;

/**
* @author sberthod
*/
import java.io.Serializable;

public class Libelle implements Serializable{

private Integer uid;
private String lib;
private String codeIso;

public Libelle(){

uid = new Integer(0);
lib ="";
codeIso = "";
}


public String getCodeIso() {
return codeIso;
}
public String getLib() {
return lib;
}
public Integer getUid() {
return uid;
}
public void setCodeIso(String string) {
codeIso = string;
}
public void setLib(String string) {
lib = string;
}
public void setUid(Integer integer) {
uid = integer;
}

public boolean equals(Object arg0) {
return super.equals(arg0);
}

public int hashCode() {
return super.hashCode();
}



}


Programme Test :

public class Multilinguisme {

/**
* Méthode de test
*
* @param args
*/
public static void main(String[] args) {


Catalogue cat = null;

try {

Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Criteria cr = session.createCriteria(Catalogue.class).add(Expression.eq("uid", "RSF")).createCriteria("libelle").add(Expression.eq("codeIso", "FR"));

List lst = cr.list();
if (lst != null) {
cat = (Catalogue) lst.get(0);
}

tx.commit();
session.close();

if (cat != null) {
System.err.println("CAT : " + cat);
System.err.println(cat.getLib());

} else {
System.err.println("GRUMPPPH pas trouvé !!");
}

} catch (Exception e) {

e.printStackTrace();
}
}

}



Message d'erreur :

Exception in thread "main" java.lang.ExceptionInInitializerError
at com.cylande.mapping.HibernateUtil.<clinit>(HibernateUtil.java:17)
at com.cylande.service.test.Multilinguisme.main(Multilinguisme.java:32)
Caused by: org.hibernate.MappingException: Foreign key (FK653C61A4359CFE5B:TCCTLP00 [CTLBID])) must have same number of columns as the referenced primary key (TCLIBP00 [LIBID,ISOLG])
at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:90)
at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:73)
at org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1122)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1061)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1145)
at com.cylande.mapping.HibernateUtil.<clinit>(HibernateUtil.java:14)
... 1 more





strusme wrote:
J'ai le même problème que toi.
Comment géré le mutlilinguisme en base avec hibernate ?


Par exemple comment mapper mon objet catalogue pour obtenir le libellé de ce dernier dans la langue souhaitée ?


-- CATALOGUES (Table)
CREATE TABLE TCCTLP00

(

CATNAM VARCHAR2(10) not null,

CTLBID number(38) not null,

constraint TCCTNP00 primary key (CATNAM)
using index tablespace INDEX_TBS

);


comment on table TCCTLP00 is 'declaration des catalogue';
comment on column TCCTLP00.CATNAM is 'nom d un catalogue';
comment on column TCCTLP00.CTLBID is 'id du libelle long du catalogue';

-- LIBELLE (Table)

CREATE TABLE TCLIBP00
(

LIBID number(38) not null,

ISOLG varchar2(2) not null,

LIBEL varchar2(255) not null,

constraint TCLIBP00 primary key (LIBID, ISOLG)

using index tablespace INDEX_TBS

);


comment on table TCLIBP00 is 'table des libelles internationalises';
comment on column TCLIBP00.LIBID is 'id libelle';
comment on column TCLIBP00.ISOLG is 'code ISO de la langue du libelle';
comment on column TCLIBP00.LIBEL is 'texte du libelle ';


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.