2009-05-12 2 views

Antwort

16

Funktioniert das Folgende nicht für Sie?

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

EntityType könnte jede Einheit Typ sein, ein String einschließlich.

+12

Ich bin ein wenig verwirrt. Bei der Frage ging es darum, eine Map zuzuordnen, aber die "beste Antwort" bezieht sich auf eine Map . Vermisse ich etwas? – whiskeysierra

+9

EntityType kann ein beliebiger Entitätstyp sein, einschließlich eines Strings. –

+2

Wie viele Tabellen generiert das? Gibt es (1) einen für die ursprüngliche Klasse, (2) eine Join-Tabelle (mit Schlüsseln für die ursprüngliche Klasse und den Entitätstyp) und (3) eine andere Tabelle für den EntityType (im gegebenen Szenario eine Tabelle mit nur dem Join Tabellenschlüssel und die abgebildete Zeichenkette)? Dies kann eine Menge Overhead sein, abhängig von den gespeicherten Strings ... – RobertG

10

Angenommen, ich habe eine Entität namens Buch, das eine Karte von Kapiteln mit:

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

} 

Es funktioniert für mich.

+0

+1. Und was, wenn ich nur das 3. Kapitel all dieser Bücher abrufen möchte? Ich habe eine ähnliche Frage: http://stackoverflow.com/questions/12952625/jpa-category-language-relationship – ianaz

+1

@ianaz 'wählen Sie c aus Buch b verbinden b.chapters c wo Schlüssel (c) = '3'' –

+3

Dies erfordert leider Hibernate-spezifische Annotationen. Die Frage war nach einer Lösung ohne. – RobertG

14

Obwohl die Antwort von Subhendu Mahanta richtig ist. Aber @CollectionOfElements ist veraltet. Sie können @ElementCollection statt:

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

Es besteht keine Notwendigkeit, eine separate Entity-Klasse für das Map Feld zu erstellen. Es wird automatisch gemacht.

1

Ein Arbeitsbeispiel:

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

Für eine Viele-zu-Viele-Beziehung benötigen Sie außerdem 'joinColumns = @JoinColumn (name =" referenzierende_Spalte ") innerhalb von @CollectionTable und' @MapKeyJoinColumn (name = "referenzierende_Spalte_andere_Tabelle") ' – Blauhirn

+0

Mein Code ist für eine Map in der Entität –