2012-07-30 28 views
25

¿Qué significa mappedBy map to? O, mejor dicho, ¿a qué debería corresponder?@OneToMany mappedBy maps to _____

El campo headers debajo mapas a @EntityFoo según @OneToManydocs? ¿Y luego Foo sería un contenedor para javax.mail.Header?

package net.bounceme.dur.usenet.model; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.mail.Header; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.persistence.*; 

@Entity 
public class Articles implements Serializable { 

    private static final long serialVersionUID = 1L; 
    private static final Logger LOG = Logger.getLogger(Articles.class.getName()); 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @Column 
    private String subject; 

    @OneToMany(mappedBy="foo") //a wrapper for Header is needed? 
    private List<Header> headers = new ArrayList<>(); 

    public Articles() { 
    } 

    public Articles(Message message) { 
     try { 
      subject = message.getSubject(); 
     } catch (MessagingException ex) { 
      Logger.getLogger(Articles.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (id != null ? id.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Articles)) { 
      return false; 
     } 
     Articles other = (Articles) object; 
     if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return subject; 
    } 

    public String getSubject() { 
     return subject; 
    } 

    public void setSubject(String subject) { 
     this.subject = subject; 
    } 
} 

Respuesta

27

Sí envoltorio para javax.mail.Header es necesario, en general no puede persistir directamente las clases arbitrarias, especialmente no las que no son serializables. Tampoco pueden ser elementos de la lista que diseñe la relación entre entidades.

Valor de mappedBy es el nombre del campo que posee el lado de la relación bidireccional. Para un bien de ejemplo, vamos a suponer que el artículo entidad tiene uno-a-muchos relación a la entidad Foo:

@OneToMany(mappedBy="article") 
private List<Foo> headers; 

Ahora bien, sabemos que debe haber otro extremo de esta relación, y es atributo, que es ubicada a Foo entidad, tiene el artículo como un tipo y es nombrado artículo:

@Entity 
public class Foo { 
... 
    @ManyToOne 
    Article article; 
} 

lado propietario (en este caso el artículo en Foo) se utiliza cuando la relación bidireccional se conserva a la base de datos. En JPA 2.0 especificación esto se contó con las palabras siguientes:

relaciones bidireccionales entre entidades gestionadas se conservará basado en referencias en poder de la parte propietaria de la relación. Es la responsabilidad del desarrollador de mantener las referencias en memoria retenidas en el lado propietario y las que se mantienen en el lado inverso consistente con entre sí cuando cambian. En el caso de one-to-one unidireccional y relaciones de uno a muchos, es responsabilidad del desarrollador asegurarse de que se respete la semántica de las relaciones.

+2

Un destello de comprensión, déjame probarlo :) – Thufir

+0

Bien, pero me aparece 'Excepción Descripción: [clase net.bounceme.dur.usenet.model.Articles] utiliza una entidad no [clase javax.mail.Header] como entidad objetivo en el atributo de relación [cabeceras de campo] .', así que tengo que replantear esa. Además, sería una idea de ManyToMany pensarlo, pero no quisiera tener todos los encabezados posibles en la base de datos, pero ya está listo. Creo que eso responde a esta pregunta. Gracias :) – Thufir

1

Marque aquí:documentation

La parte pertinente es:

 mappedBy 
     The field that owns the relationship. 

Es una especie de auto-explicativo. ¿Quieres ejemplos?

Si su Article tiene muchas Header objetos, por ejemplo, a continuación, Article es ser dueño de la realationship ya que el artículo tiene muchas cabeceras.

+2

el campo de qué clase pls? – Thufir

+7

diciendo ¡lea la documentación no es una buena respuesta! Especialmente cuando son los terribles documentos API. Soy nuevo en el material del framework de la entidad, pero el bit clave aquí parece ser notar que mapeado se refiere a un campo (que es típicamente privado) en la ** otra ** clase –

+1

. Ni siquiera recuerdo la pregunta muy bien. Normalmente no rechazo una respuesta, por lo que vale (realmente tiene que ser una respuesta horrible, que no es el caso anterior), pero me doy cuenta de que el enlace del documento es a javaee5 en lugar de 6.Creo que la sintaxis "relación de propiedad" ayuda, que "Artículo" es la relación propietaria. Personalmente, no me importa un enlace RTFM, siempre que no sea "el" manual, sino una página o sección. – Thufir

Cuestiones relacionadas