Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Clee implicite pour les "@Entity" dans les ORM ?

4 réponses
Avatar
Vincent Cantin
Bonjour,

Je suis bloque devant un probleme de modelisation de mon mapping avec une
base de donnee.

Pour simplifier le probleme, disons que j'ai 2 classes :

@Entity
public class GameEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public long id;

public Color color;
}

public class Color implements Serializable {
float r;
float g;
float b;
}

Je voudrais que 2 instances de GameEntity puissent faire reference a la meme
instance de la classe Color, mais je ne veux pas avoir a rajouter un champs
"id" qui serve de clee a ma classe Color. En fait, je n'ai jamais besoin
d'acceder a mon instance depuis une clee, je n'y accede seulement que par le
biais des autres instances qui l'utilisent, et ca m'ennuie *enormement* de
devoir rajouter un champs "id" dans cette classe car je n'en ai pas besoin
du tout et je veux que mes objets soient legers comme des bons vieux POJO.

Je suis conscient que le bidule (entite manager ?) qui est charge de
sauvegarder et charger mes classes depuis la base de donnee en a besoin,
mais je ne veux pas que cette clee soit invasive et apparaissent dans la
classe.

Y a-t'il moyen de dire a l'ORM que Color possede une clee implicite,
conservee dans la table de la base de donnee, mais pas dans la classe, et
que ce soit l'EntityManager qui la conserve en memoire avec un mapping<cle,
instance> pour ce genre de classes ?

Ma classe Color ressemblerait a :

@Entity
@ImplicitId(type="long", name="id") // ... quelque chose dans ce genre la
public class Color implements Serializable {
float r;
float g;
float b;
}

Quel ORM peut faire ca ? JPA le peut ? Hibernate le peut ?

4 réponses

Avatar
TestMan
Bonjour,

Je suis bloque devant un probleme de modelisation de mon mapping avec une
base de donnee.

Pour simplifier le probleme, disons que j'ai 2 classes :

@Entity
public class GameEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public long id;

public Color color;
}

public class Color implements Serializable {
float r;
float g;
float b;
}

Je voudrais que 2 instances de GameEntity puissent faire reference a la meme
instance de la classe Color, mais je ne veux pas avoir a rajouter un champs
"id" qui serve de clee a ma classe Color. En fait, je n'ai jamais besoin
d'acceder a mon instance depuis une clee, je n'y accede seulement que par le
biais des autres instances qui l'utilisent, et ca m'ennuie *enormement* de
devoir rajouter un champs "id" dans cette classe car je n'en ai pas besoin
du tout et je veux que mes objets soient legers comme des bons vieux POJO.

Je suis conscient que le bidule (entite manager ?) qui est charge de
sauvegarder et charger mes classes depuis la base de donnee en a besoin,
mais je ne veux pas que cette clee soit invasive et apparaissent dans la
classe.

Y a-t'il moyen de dire a l'ORM que Color possede une clee implicite,
conservee dans la table de la base de donnee, mais pas dans la classe, et
que ce soit l'EntityManager qui la conserve en memoire avec un mapping<cle,
instance> pour ce genre de classes ?

Ma classe Color ressemblerait a :

@Entity
@ImplicitId(type="long", name="id") // ... quelque chose dans ce genre la
public class Color implements Serializable {
float r;
float g;
float b;
}

Quel ORM peut faire ca ? JPA le peut ? Hibernate le peut ?




Bonjour,

Je cite §2.4.1 de la spec : « Every entity must have a primary key. »

En clair, si tu dois avoir la même couleur, c'est à dire :
- la même instance de la class Color qui sont référencée par plusieurs
autres objets
- cette instance étant modifiée le sera pour tous les objets pointés
Alors il te faudra un identifiant.

Par contre si dans ton modèle la classe Color tu as la contrainte
unique(r,g,b) alors tu peux utiliser un @Id devant les trois champs ;-)

Sinon, si tu n'a pa besoin d'avoir absolument le même objet et qu'il est
acceptable de perdre ainsi la possibilité de changer la couleur pour
plusieurs instance de GameEntity alors tu peux simplement utiliser une
@Embeded / @Embedable voir
http://weblogs.java.net/blog/guruwons/archive/2006/10/jpa_supplement.html

En espérant que tu trouveras ton bonheur dans tout celà ...

A+
TM

Avatar
Vincent Cantin
Bonjour,

Je cite §2.4.1 de la spec : « Every entity must have a primary key. »

En clair, si tu dois avoir la même couleur, c'est à dire :
- la même instance de la class Color qui sont référencée par plusieurs
autres objets
- cette instance étant modifiée le sera pour tous les objets pointés
Alors il te faudra un identifiant.

Par contre si dans ton modèle la classe Color tu as la contrainte
unique(r,g,b) alors tu peux utiliser un @Id devant les trois champs ;-)

Sinon, si tu n'a pa besoin d'avoir absolument le même objet et qu'il est
acceptable de perdre ainsi la possibilité de changer la couleur pour
plusieurs instance de GameEntity alors tu peux simplement utiliser une
@Embeded / @Embedable voir
http://weblogs.java.net/blog/guruwons/archive/2006/10/jpa_supplement.html

En espérant que tu trouveras ton bonheur dans tout celà ...

A+
TM


En fait, je ne peux pas me permettre d'integrer (embed) la classe Color du
tout, donc il faut absolument que je puisse mettre Color comme une @Entity
dans la base de donnee, et donc elle devra obligatoirement avoir un @Id au
moins dans la base de donnee.

Je ne sais pas si ta citation de la spec parle du code java ou bien de
l'entitee dans la base de donnee. En faisant des recherches, j'ai vu que
d'apres la doc d'Hibernate-xml, l'identifiant est optionnel, et qu'Hibernate
s'occupe de le gerer (peut-etre avec un map a l'exterieur de ma classe,
comme je l'avais decrit dans mon post). Je ne sais pas si ce comportement
marchera encore pour sa version avec annotations. Je croise les doigts pour
que ca marche, parce que j'ai vraiment besoin d'utiliser les annotations et
sans @Id dans mes classes.

Je vais le tester ce weekend. Si ca ne marche pas, je pense que je serais
contraint d'aller hacker hibernate.

Avatar
1 connu
EOF mapping en java fourni avec WebObjects fait ca. L'id n'est pas visible dans la classe.
Mais c'est pas du J2EE !




"Vincent Cantin" a écrit dans le message de news: emllp3$fvg$
Bonjour,

Je suis bloque devant un probleme de modelisation de mon mapping avec une base de donnee.

Pour simplifier le probleme, disons que j'ai 2 classes :

@Entity
public class GameEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public long id;

public Color color;
}

public class Color implements Serializable {
float r;
float g;
float b;
}

Je voudrais que 2 instances de GameEntity puissent faire reference a la meme instance de la classe Color, mais je ne veux pas
avoir a rajouter un champs "id" qui serve de clee a ma classe Color. En fait, je n'ai jamais besoin d'acceder a mon instance
depuis une clee, je n'y accede seulement que par le biais des autres instances qui l'utilisent, et ca m'ennuie *enormement* de
devoir rajouter un champs "id" dans cette classe car je n'en ai pas besoin du tout et je veux que mes objets soient legers comme
des bons vieux POJO.

Je suis conscient que le bidule (entite manager ?) qui est charge de sauvegarder et charger mes classes depuis la base de donnee
en a besoin, mais je ne veux pas que cette clee soit invasive et apparaissent dans la classe.

Y a-t'il moyen de dire a l'ORM que Color possede une clee implicite, conservee dans la table de la base de donnee, mais pas dans
la classe, et que ce soit l'EntityManager qui la conserve en memoire avec un mapping<cle, instance> pour ce genre de classes ?

Ma classe Color ressemblerait a :

@Entity
@ImplicitId(type="long", name="id") // ... quelque chose dans ce genre la
public class Color implements Serializable {
float r;
float g;
float b;
}

Quel ORM peut faire ca ? JPA le peut ? Hibernate le peut ?




Avatar
Franck

Quel ORM peut faire ca ? JPA le peut ? Hibernate le peut ?


CF clés composites dans Hibernate
Franck

--
-
Franck
mailto: