2009-05-12 9 views

Répondre

16

Est-ce que ce qui suit ne fonctionne pas pour vous?

@ManyToMany(cascade = CascadeType.ALL) 
Map<String,EntityType> entitytMap = new HashMap<String, EntityType>(); 

EntityType pourrait être tout type d'entité, y compris un String.

+12

Je suis un peu confus. La question portait sur la mise en correspondance d'une carte , mais la "meilleure réponse" concerne une carte . Est-ce que je manque quelque chose? – whiskeysierra

+9

EntityType peut être n'importe quel type d'entité, y compris une chaîne. –

+2

Combien de tables cela génère-t-il? Y a-t-il (1) un pour la classe originale, (2) une table de jointure (avec les clés pour la classe d'origine et le type d'entité) et (3) une autre table pour EntityType (dans le scénario donné, une table avec seulement la jointure clé de table et la chaîne mappée)? Cela peut être beaucoup de surcharge, selon les chaînes enregistrées ... – RobertG

10

Supposons que j'ai une entité nommée livre qui est d'avoir une carte de chapitres:

import java.io.Serializable; 
import java.util.Map; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.JoinTable;  
import org.hibernate.annotations.CollectionOfElements; 
import org.hibernate.annotations.MapKey; 
@Entity 
public class Book implements Serializable{ 
@Column(name="BOOK_ID") 
@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Long bookId;  

@CollectionOfElements(targetElement=java.lang.String.class) 
@JoinTable(name="BOOK_CHAPTER", 
     [email protected](name="BOOK_ID")) 
@MapKey ([email protected](name="CHAPTER_KEY")) 
@Column(name="CHAPTER") 
private Map<String,String> chapters; 
public Long getBookId() { 
    return bookId; 
} 
public void setBookId(Long bookId) { 
    this.bookId = bookId; 
} 
public Map<String,String> getChapters() { 
    return chapters; 
} 
public void setChapters(Map<String,String> chapters) { 
    this.chapters = chapters; 
}    

} 

Il fonctionne pour moi.

+0

+1. Et si je veux récupérer seulement le chapitre 3 de tous ces livres? J'ai une question similaire: http://stackoverflow.com/questions/12952625/jpa-category-language-relationship – ianaz

+1

@ianaz 'sélectionner c du livre b rejoindre b.chapters c où la clé (c) = '3'' –

+3

Malheureusement, cela nécessite des annotations spécifiques à hibernate. La question était pour une solution sans. – RobertG

14

Bien que la réponse donnée par Subhendu Mahanta soit correcte. Mais @CollectionOfElements est obsolète. Vous pouvez utiliser @ElementCollection à la place:

@ElementCollection 
@JoinTable(name="ATTRIBUTE_VALUE_RANGE", [email protected](name="ID")) 
@MapKeyColumn (name="RANGE_ID") 
@Column(name="VALUE") 
private Map<String, String> attributeValueRange = new HashMap<String, String>(); 

Il n'y a pas besoin de créer une catégorie distincte de l'entité pour le champ Map. Cela sera fait automatiquement.

1

Un exemple de réalisation:

 @ElementCollection(fetch=FetchType.EAGER) 
     @CollectionTable(name = "TABLENAME") 
     @MapKeyColumn(name = "KEY") 
     @Column(name = "VALUE") 
     public Map<String, String> getMap() { 
      return _map; 
     } 
+0

pour une relation many-to-many, vous aurez également besoin de 'joinColumns = @JoinColumn (name =" referencing_column ")' dans @CollectionTable et '@MapKeyJoinColumn (name =" referencing_column_other_table ")' – Blauhirn

+0

Mon code est pour une carte dans l'entité –

Questions connexes