2012-07-30 21 views
25

mappedBy bản đồ to là gì? Hay đúng hơn, bản đồ nên là gì?@OneToMany ánh xạBản đồ tới _____

Trường headers bên dưới bản đồ thành @EntityFoo theo @OneToManydocs? Và sau đó Foo sẽ là trình bao bọc cho 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; 
    } 
} 

Trả lời

27

Có trình bao bọc cho javax.mail.Header là cần thiết, nói chung bạn không thể duy trì các lớp tùy ý trực tiếp, đặc biệt không phải là các lớp không có khả năng nối tiếp. Ngoài ra, chúng không thể là các thành phần của danh sách thiết kế mối quan hệ giữa các thực thể.

Giá trị của ánh xạBởi là tên của trường sở hữu mặt của mối quan hệ hai chiều. Đối với một lợi ích của ví dụ, chúng ta hãy giả sử rằng Điều thực thể không có một-nhiều mối quan hệ với Foo thực thể:

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

Bây giờ chúng ta biết rằng phải có đầu kia của mối quan hệ này, và nó là thuộc tính, đó là nằm Foo thực thể, không có Điều như một loại và được đặt tên bài viết:

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

sở hữu bên (trong bài viết này trong trường hợp Foo) được sử dụng khi mối quan hệ hai chiều là vẫn kiên trì cơ sở dữ liệu. Trong đặc tả JPA 2.0, điều này được nói với các từ sau:

Mối quan hệ hai chiều giữa các thực thể được quản lý sẽ được lưu giữ dựa trên các tham chiếu do bên sở hữu của mối quan hệ nắm giữ. Đó là trách nhiệm của nhà phát triển để giữ các tài liệu tham khảo trong bộ nhớ được giữ lại ở bên sở hữu và những tài liệu được giữ ở mặt trái phù hợp với lẫn nhau khi chúng thay đổi. Trong trường hợp một chiều và các mối quan hệ một - nhiều, trách nhiệm của nhà phát triển là đảm bảo rằng ngữ nghĩa của các mối quan hệ được tuân thủ.

+2

Một ánh sáng lung linh của sự hiểu biết, hãy thử nó :) – Thufir

+0

Ok, nhưng tôi nhận được 'Ngoại lệ Mô tả: [lớp net.bounceme.dur.usenet.model.Articles] sử dụng một thực thể không [lớp javax.mail.Header] như thực thể đích trong thuộc tính mối quan hệ [tiêu đề trường] .' vì vậy tôi cần phải suy nghĩ lại về thuộc tính đó. Ngoài ra, nó sẽ là một ManyToMany đến để suy nghĩ về nó, nhưng tôi sẽ không muốn mọi tiêu đề có thể có trong cơ sở dữ liệu - nhưng đó là xuống đường. Tôi nghĩ rằng câu trả lời cho câu hỏi này. Cảm ơn :) – Thufir

1

Kiểm tra ở đây:documentation

Phần liên quan là:

 mappedBy 
     The field that owns the relationship. 

Nó là loại tự giải thích. Bạn có muốn ví dụ?

Nếu Article của bạn có nhiều Header đối tượng ví dụ sau đó Article được sở hữu realationship kể từ khi bài viết nhiều tiêu đề.

+2

trường nào mà lớp học bắt đầu? – Thufir

+7

nói đọc tài liệu không phải là câu trả lời hay! Đặc biệt là khi các tài liệu API khủng khiếp của nó. Im mới cho các công cụ khung thực thể nhưng bit chính ở đây có vẻ là để lưu ý rằng ánh xạ bằng cách tham chiếu đến một trường (thường là riêng tư) trên ** khác ** lớp –

+1

Tôi thậm chí không nhớ câu hỏi rất tốt. Tôi không bình thường downvote một câu trả lời, cho những gì nó có giá trị (nó thực sự phải là một câu trả lời crappy, mà không phải là trường hợp trên), nhưng tôi nhận thấy rằng liên kết doc là javaee5 chứ không phải là 6.Tôi nghĩ cú pháp "sở hữu mối quan hệ" giúp, rằng 'Điều' là mối quan hệ sở hữu. Cá nhân, tôi không bao giờ quan tâm đến một liên kết RTFM, miễn là nó không phải là "hướng dẫn", mà là một trang hoặc một phần. – Thufir

Các vấn đề liên quan