2012-07-30 14 views
25

Co oznacza mappedBy mapa na? A raczej, na co powinien on mapować?@OneToMany mapowane mapy do _____

polu poniżej mapy headers do @EntityFoo zgodnie @OneToManydocs? A następnie Foo będzie wrapper dla 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; 
    } 
} 

Odpowiedz

27

Tak, otoki dla javax.mail.Header jest potrzebny, w ogóle nie można utrzymywać bezpośrednio dowolne klasy, zwłaszcza te, które nie są Serializowalne. Nie mogą też być elementami listy projektującej relację między jednostkami.

Wartość mappedBy to nazwa pola będącego właścicielem relacji dwukierunkowej. Przez wzgląd na przykład, załóżmy, że art podmiot ma jeden-do-wielu relacji do podmiotu Foo:

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

Teraz wiemy, że musi być drugi koniec tej relacji, i to jest atrybut, który jest znajduje się podmiot Foo, ma artykuł jako typ i nazywa artykuł:

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

posiadania strony (w tym przypadku artykułu w Foo) jest stosowany, gdy relacja dwukierunkowa jest zachowywane w bazie danych. W specyfikacji JPA 2.0 to opowiedziana z następującymi słowami:

dwukierunkowe relacje pomiędzy podmiotami zarządzanych będą utrzymywały na podstawie referencji posiadanych przez strony posiadania relacji. Obowiązkiem programisty jest przechowywanie referencji przechowywanych w pamięci po stronie własnej i przechowywanych po stronie odwrotnej, zgodnych z , po zmianie. W przypadku jednokierunkowej relacji jeden-do-jednego, to jest odpowiedzialnością programisty do zapewnienia, że ​​semantyka relacji jest przestrzegana.

+2

Przełom zrozumienia, lemme go spróbuj :) – Thufir

+0

OK, ale otrzymuję 'Opis wyjątku: [class net.bounceme.dur.usenet.model.Articles] używa nie-obiektu [klasa javax.mail.Header] jako element docelowy w atrybucie relacji [nagłówki pól]. "więc muszę przemyśleć tę. Poza tym byłby to pomysł ManyToMany, ale nie życzyłbym sobie wszystkich możliwych nagłówków w bazie danych - ale to już wszystko. Myślę, że to odpowiedź na to pytanie. Dzięki :) – Thufir

1

Sprawdź tutaj:documentation

Odpowiedni fragment brzmi:

 mappedBy 
     The field that owns the relationship. 

To niby oczywiste. Czy chcesz przykłady?

Jeśli Article ma wiele Header przedmiotów na przykład wtedy Article jest posiadanie realationship ponieważ artykuł ma wiele nagłówków.

+2

na którym polu klasy pls? – Thufir

+7

Powiedzenie przeczytania dokumentacji nie jest dobrą odpowiedzią! Zwłaszcza gdy jest to straszne API. Jestem nowy w strukturze encji, ale kluczem tutaj wydaje się zauważyć, że mapowane przez odwołanie do pola (które zazwyczaj jest prywatne) na ** innej ** klasie –

+1

Nie pamiętam nawet dobrze tego pytania. Zwykle nie odpowiadam za odpowiedź, bo jest ona warta (naprawdę musi to być błahostka, co nie ma miejsca powyżej), ale zauważam, że link do dokumentu jest raczej do javaee5 niż 6.Myślę, że składnia "posiadanie relacji" pomaga, że ​​"Artykuł" jest relacją posiadania. Osobiście nie mam nic przeciwko łączu RTFM, pod warunkiem, że nie jest to "instrukcja", ale strona lub sekcja. – Thufir

Powiązane problemy