我正在开发java应用程序,并使用JPA与数据库进行交互,我有两个重要问题:
在A中:
@ManyToOne
private B attribute; 在B中
@OneToMany
private List<A> list;这就足够让双向联系了吗?还是必须使用mappedBy?
在B中
@OneToMany(mappedBy = "attribute")
private List<A> list;我知道我不会创建B类,也不会创建一个列表和赋值对象,所以我不会在B旁边做任何事情。我只会反复创建类A,每次我给它分配一个B对象时,我可能会有几个类A具有相同的受影响对象B,我希望B自动更新这个链接及其A的列表。
发布于 2015-07-12 23:37:06
mappedBy添加到其表中没有外键的实体中(本例中最有可能是B )。mappedBy站在错误的一边,您应该会看到一个异常。发布于 2015-07-13 16:09:25
这就足够让双向联系了吗?还是必须使用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类,也不会创建一个列表和赋值对象,所以我不会在B旁边做任何事情。我只会反复创建类A,每次我给它分配一个B对象时,我可能会有几个类A具有相同的受影响对象B,我希望B自动更新这个链接及其A的列表。
在这个场景中,您创建了一个类A,其中的属性字段中填充了B的实例。现在,当您持久化A-一个新实例时,它将在属性字段中包含B的一个实例,该实例可能是新的,也可能不是新的。我们希望JPA能够持久化A,然后根据关系导航,并且也要持久化B。如果B已经存在于perssitence上下文中,则忽略它。添加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;这些家伙写得很好."Pro JPA 2精通Java™持久性API“,由Mike和Merrick编写,
https://stackoverflow.com/questions/31373412
复制相似问题