2009-05-12 17 views

risposta

16

Non funziona il seguente lavoro?

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

EntityType potrebbe essere qualsiasi tipo di entità, compreso un String.

+12

io sono un po 'confuso. La domanda riguardava la mappatura di una mappa , ma la "risposta migliore" riguarda una mappa . Mi manca qualcosa? – whiskeysierra

+9

EntityType può essere qualsiasi tipo di entità, inclusa una stringa. –

+2

Quanti tavoli genera? C'è (1) uno per la classe originale, (2) una tabella di join (con le chiavi per la classe originale e il tipo di entità) e (3) un'altra tabella per EntityType (nello scenario dato, una tabella con solo l'unione chiave di tabella e la stringa mappata)? Questo può essere un sovraccarico, a seconda delle stringhe salvate ... – RobertG

10

Supponiamo che io sono un soggetto di nome libro che sta avendo una mappa di capitoli:

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; 
}    

} 

Funziona per me.

+0

+1. E se volessi recuperare solo il capitolo 3 di tutti questi libri? Ho una domanda simile: http://stackoverflow.com/questions/12952625/jpa-category-language-relationship – ianaz

+1

@ianaz 'seleziona c da Book b join b.chapters c where key (c) = '3'' –

+3

Sfortunatamente, ciò richiede annotazioni specifiche per l'ibernazione. La domanda era per una soluzione senza. – RobertG

14

Sebbene la risposta data da Subhendu Mahanta sia corretta. Ma @CollectionOfElements è deprecato. È possibile utilizzare @ElementCollection invece:

@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>(); 

Non v'è alcuna necessità di creare una classe di entità separata per il campo Map. Sarà fatto automaticamente.

1

Un esempio di lavoro:

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

per una relazione molti-a-molti, avresti anche bisogno di 'joinColumns = @JoinColumn (name =" referencing_column ")' all'interno di @CollectionTable e '@MapKeyJoinColumn (name =" referencing_column_other_table ")' – Blauhirn

+0

Il mio codice è per una mappa nell'entità –

Problemi correlati