J'utilise Hibernate 3.5.a-Final comme ORM-Layer dans une application Web. J'ai plusieurs Beans avec le même code-sniplet qui me fait penser que ce design n'est pas le meilleur. Mais je ne peux pas comprendre comment mettre en place un meilleur en hibernation.Hibernate @ElementCollection - Meilleure solution requise
Exigences
- Plusieurs classes doivent contenir des descriptions localisées dans plusieurs endroits
- Ceux-ci doivent être persisté dans la db
- Ils doivent être recherchés par sous-chaîne pour tous les paramètres régionaux (montrer si la seachstring est une sous-chaîne de n'importe quelle description)
- Les descriptions localisées doivent pouvoir être interrogées sans charger l'objet principal (par l'identificateur d'objet maître, le type et l'environnement local)
solution actuelle (ne résout pas la dernière exigence)
Chaque classe contient un HashMap annoté
@ElementCollection(fetch=FetchType.EAGER)
@CollectionTable(name = "localized[X]Descriptions", joinColumns = @JoinColumn(name = "id"))
@MapKeyJoinColumn(name = "locale")
public Map<Locale, String> getLocalizedDescriptions() {
return localizedDescriptions;
}
[X] beeing le nom de la classe
pour chaque classe la est une table supplémentaire (générée par hibernate)
create table localized[X]Descriptions (
id integer not null,
localizedDescriptions varchar(255),
localizedDescriptions_KEY varchar(255),
primary key (id, localizedDescriptions_KEY)
)
Pour une raison quelconque, le @MapKeyJoinColumn
est ignorée ...
Ce que je préfère serait une seule table comme ceci:
create table localizedDescriptions (
class varchar(255) not null,
id integer not null,
locale varchar(50) not null,
description varchar(255) not null,
primary key (class, id, locale)
)
Ce serait un gros plus si la mise en œuvre serait en utilisant interrogeable des critères-api (qui ISN n'est pas compatible avec @ElementCollection
s pour autant que je sache). Mais je ne peux pas comprendre comment implémenter ceci. Tous les pointeurs seraient bienvenus