Wie kann ich eine Map in JPA ohne Verwendung der Hibernate-Klassen zuordnen?JPA-Map <String, String> Zuordnung
Antwort
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.
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.
+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
@ianaz 'wählen Sie c aus Buch b verbinden b.chapters c wo Schlüssel (c) = '3'' –
Dies erfordert leider Hibernate-spezifische Annotationen. Die Frage war nach einer Lösung ohne. – RobertG
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.
Ein Arbeitsbeispiel:
@ElementCollection(fetch=FetchType.EAGER)
@CollectionTable(name = "TABLENAME")
@MapKeyColumn(name = "KEY")
@Column(name = "VALUE")
public Map<String, String> getMap() {
return _map;
}
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
Mein Code ist für eine Map
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
EntityType kann ein beliebiger Entitätstyp sein, einschließlich eines Strings. –
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