2009-05-12 33 views

Respuesta

16

¿No funciona lo siguiente para usted?

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

EntityType podría ser cualquier tipo de entidad, incluyendo un String.

+12

yo soy un poco confundido. La pregunta era sobre mapear un Map , pero la "mejor respuesta" es sobre un Map . ¿Extraño algo? – whiskeysierra

+9

EntityType podría ser cualquier tipo de entidad, incluida una cadena. –

+2

¿Cuántas tablas genera esto? ¿Hay (1) uno para la clase original, (2) una tabla de unión (con claves para la clase original y el tipo de entidad) y (3) otra tabla para EntityType (en el escenario dado, una tabla con solo la combinación tecla de tabla y la cadena mapeada)? Esto puede ser una gran sobrecarga, dependiendo de las cadenas guardadas ... – RobertG

10

Supongamos que tengo una entidad llamada libro que está teniendo un Mapa de capítulos:

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

} 

Funciona para mí.

+0

+1. ¿Y si quiero recuperar solo el capítulo 3 de todos estos libros? Tengo una pregunta similar: http://stackoverflow.com/questions/12952625/jpa-category-language-relationship – ianaz

+1

@ianaz 'seleccione c del Libro b join b.chapters c donde key (c) = '3'' –

+3

Desafortunadamente, esto requiere anotaciones específicas de hibernación. La pregunta era por una solución sin. – RobertG

14

Aunque la respuesta dada por Subhendu Mahanta es correcta. Pero @CollectionOfElements está en desuso. Se puede utilizar en lugar @ElementCollection:

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

No hay necesidad de crear una clase de entidad separada para el campo Map. Será hecho automáticamente.

1

Un ejemplo de trabajo:

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

para una relación muchos-a-muchos, también necesitaría 'joinColumns = @JoinColumn (name =" referencia_columna) 'dentro de @CollectionTable y' @MapKeyJoinColumn (name = "referencia_columna_otra_tabla)' – Blauhirn

+0

Mi código es para un Mapa en la entidad –

Cuestiones relacionadas