JPA Annotations和mappedBy

时间:2015-07-12 23:00:47

标签: java jpa

我正在研究java应用程序并使用JPA与数据库进行交互,我有两个重要的问题:

  1. 我想在两个类之间建立双向链接,因为我需要访问双方的数据。让我们来看两个A和B类的情况,A * -1 B(作为UML图,A有一个唯一的B,B有几个A.)。
  2. 在A:

    pdf(file="acc_weeks_standard.pdf",width=8,height=6)
    full()
    dev.off()
    

    在B

    @ManyToOne
    private B attribute; 
    

    这足以构成双向链接吗?或者必须使用mappedBy?

    1. 这给我们带来了第二个问题,如果mappedBy被置于错误的一边,它只会影响性能甚至更糟? (数据不存在)?例如,在基数1- *的情况下,我们别无选择,mappedBy应该位于OneToMany的一侧,在这种情况下:
    2. 在B

      @OneToMany
      private List<A> list;
      

      知道我不会创建B类,创建List并分配对象这一事实,我不会在B方面做任何事情。我只是重复创建A类,每次为它分配一个B对象时,所以我可能有几个具有相同受影响对象B的类A,我希望B自动更新此链接及其A列表。

3 个答案:

答案 0 :(得分:2)

  

这足以构成双向链接吗?或者必须使用   的mappedBy?

对于Bi-directional关系,这是强制性的。

  

如果将mappedBy放在上面,这就把我们带到了第二个问题   错误的一面,它只会影响性能甚至更糟?   (数据没有保留)?

更糟糕 - 它不起作用但不会沉默,你会看到例外。

说完这个很容易理解。它与@OneToMany一致。

This可能会帮助您更多地了解这一点。

答案 1 :(得分:1)

  • mappedBy应该添加到其表中没有外键的实体中(在这种情况下很可能是B)。
  • 如果mappedBy错误,您应该看到异常。

答案 2 :(得分:1)

  

这足以构成双向链接吗?或者必须使用   的mappedBy?

不完全。你需要MappedBy属性来反向的双向多对一关系 - 这是没有外键的一方,并且始终是一个方面的多对一关系。您还需要关系许多方面的连接列信息。

总结如下:

多对一方面 - 关系的拥有方 - @JoinColumn 信息就在这一边。 这需要在单向和双向关系中指定

一对多方面 - 反面 - mappedBy 这一侧的属性。 如果关系是双向的,则需要指定。

@Entity
public class A ……..
//Owning side of the relationship with the @JoinColumn annotation.
    @ManyToOne
    // Assume TABLEPK column holds PK of B's table
    @JoinColumn (name = "TABLEBPK")
    private B attribute;


@Entity
public class B ……

//Inverse side of the relationship with the MappedBy attribute.
    @OneToMany(MappedBy = “attribute”)
    private List<A> list;
  

如果将mappedBy放在上面,这就把我们带到了第二个问题   错误的一面,它只会影响性能甚至更糟?

它不会起作用。只是把它放在关系的反面。

  

知道我不会创建B类,并创建一个List   并分配对象,我将不会在B方面做任何事情。我只是创建   反复上课A,每次我给它分配一个B对象,所以我可以   有几个类A具有相同的受影响对象B和我想要的   B自动更新此链接及其A。

列表

在这种情况下,您创建了一个类A,其中属性字段填充了B的实例。现在当您持久化A - 一个新实例时 - 它将包含一个B实例。属性字段可能是也可能不是新的。我们希望JPA能够持久化A然后在整个关系中导航并保持B。如果B已经存在于持久性上下文中,则忽略它。添加CascadeType.PERSIST即可实现此目的。

@Entity
public class A ……..
//Owning side of the relationship with the @JoinColumn annotation.
    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn (name = "TABLEBPK")
    private B attribute;

这些家伙写的很好......   &#34; Pro JPA 2掌握Java™Persistence API&#34;作者:Mike Keith和Merrick Schnicariol。&#34;