2012-07-30 73 views
25

什么mappedBy地图?或者,相反,它应该映射到什么?@OneToMany的mappedBy映射到_____

下面地图的headers字段@EntityFoo按照@OneToManydocs?然后Foo将是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; 
    } 
} 

回答

27

是包装,一般你不能坚持直接任意类,尤其是不是不可序列化的人。它们也不能成为设计实体之间关系的列表元素。的mappedBy的

值是拥有的双向关系一侧的字段的名称。例如的缘故,让我们假设第实体确实有一个一对多的关系,以富实体:

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

现在我们知道,必须有这种关系的另一端,是属性,它是位于富实体,确实有文章作为一种类型的,被命名为文章

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

拥有侧(美孚这种情况下本文中),当双向关系被永久保存到该数据库被使用。在JPA 2.0规范这种杂糅了下面的话:管理实体之间

双向关系将基于关系的拥有方持有的引用被持久化 。这是 开发商的责任,保持对拥有方和那些在反侧 对方时,他们改变一贯主张举行 在内存中的引用。在单向一到一个 和一个一对多的关系的情况下,这是开发商的责任 确保关系的语义得到遵守。

+2

一丝理解,让我去试试吧:) – Thufir 2012-07-30 09:33:20

+0

好吧,但是我得到'Exception Description:[class net.bounceme.dur.usenet.model.Articles]使用非实体[class javax.mail.Header]作为目标实体的关系属性[字段标题]。“所以我需要重新考虑一个。另外,ManyToMany会想到它,但我不希望数据库中的所有可能的标题 - 但是这是一条路。我认为这回答了这个问题。谢谢 :) – Thufir 2012-07-30 10:07:41

1

入住这里:documentation

相关部分是:

 mappedBy 
     The field that owns the relationship. 

它是一种不言自明的。你想要例子吗?

如果您Article有许多Header对象,例如然后Article被拥有的自赫志文章许多头。是需要javax.mail.Header

+2

哪一类PLS的领域? – Thufir 2012-07-30 09:26:42

+7

说读文档不是一个好的答案!特别是当它的糟糕的API文档。进出口新的实体框架的东西,但这里的关键位似乎是要注意,映射通过指场(即通常是私有)的** **其他类 – 2013-11-18 10:09:00

+1

我甚至不记得这个问题非常好。我通常不会低估一个答案,因为它的价值(它真的必须是一个蹩脚的答案,而不是上述情况),但我注意到doc链接是javaee5而不是6。我认为“拥有关系”的句法有所帮助,“文章”就是拥有关系。就个人而言,我不介意RTFM链接,前提是它不是“手册”,而是页面或部分。 – Thufir 2013-11-26 21:10:39