我正在研究java应用程序并使用JPA与数据库进行交互,我有两个重要的问题:
在A:
pdf(file="acc_weeks_standard.pdf",width=8,height=6)
full()
dev.off()
在B
@ManyToOne
private B attribute;
这足以构成双向链接吗?或者必须使用mappedBy?
在B
@OneToMany
private List<A> list;
知道我不会创建B类,创建List并分配对象这一事实,我不会在B方面做任何事情。我只是重复创建A类,每次为它分配一个B对象时,所以我可能有几个具有相同受影响对象B的类A,我希望B自动更新此链接及其A列表。
答案 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;