@OneToMany中的mappedBy映射到______。

31
mappedBy应该映射到什么?或者说,它应该映射到什么?
下面的headers字段根据@OneToMany 文档将其映射为@EntityFoo?那么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;
    }
}
2个回答

37

一般来说,需要为javax.mail.Header添加包装器,因为您通常不能直接持久化任意类,尤其是那些不可序列化的类。此外,它们也不能成为设计实体之间关系的列表元素。

mappedBy的值是双向关系拥有方的字段名。举个例子,假设Article实体确实具有与Foo实体的一对多关系:

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

现在我们知道这个关系必须有另一个结尾,它是属性,位于Foo实体中,具有Article类型,并命名为article

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

当双向关系持久化到数据库时,所有权方(在这种情况下是Foo中的文章)被使用。在JPA 2.0规范中,以下话语表明了这一点:

托管实体之间的双向关系将基于由关系所有方保留的引用进行持久化。当这些引用更改时,开发人员有责任使所有权方和反向方持有的内存引用相互一致。对于单向一对一和一对多关系,开发人员有责任确保遵守关系的语义。


2
稍微明白了一点,让我去尝试一下 :) - Thufir
好的,但我得到了“异常描述:[class net.bounceme.dur.usenet.model.Articles]在关系属性[field headers]中使用非实体[class javax.mail.Header]作为目标实体。”所以我需要重新考虑一下。另外,现在想起来它应该是ManyToMany,但我不想在数据库中存储每个可能的标题 - 但这是未来的事情。我想这回答了这个问题。谢谢 :) - Thufir

1

请在此处查看:文档

相关部分如下:

      mappedBy
      The field that owns the relationship.

这有点不言自明。你需要例子吗?

例如,如果你的文章有许多标题对象,那么文章就拥有了这个关系,因为文章许多标题。


3
请问您所指的领域是哪个类别? - Thufir
14
“说阅读文档不是一个好答案!特别是当API文档很糟糕时。我对实体框架的东西还很陌生,但这里关键的一点似乎是要注意“mapped by”是指另一个类中通常为私有字段的内容。” - JonnyRaa
2
我甚至不太记得问题了。就我个人而言,我不会轻易地对答案进行负评(这真的必须是一个糟糕的答案,而上面的情况并非如此),但我注意到文档链接指向的是javaee5而不是6。我认为“拥有关系”这个语法有所帮助,即Article是拥有关系。就我个人而言,我从不介意RTFM链接,只要它不是“那个”手册,而是一个页面或部分。 - Thufir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接