2012-02-14 47 views
1

我正在为我的实习开发JPA Compliancy工具包......该工具包的一部分涉及测试正确实施角落案例。@ ManyToMany/@ OneToMany mappedby属性用于双向关联

@ManyToMany具有mappedBy属性。 JPA声明:

String mappedBy - 拥有该关系的字段或属性。除非关系是单向的,否则是必需的。

没有给出默认值 - 默认列为空。

给定双向@ManyToMany - 本示例来自JPA 2.0 JSR-317规范本身!

客户

@ManyToMany 
@JoinTable(name="CUST_PHONES") 
public Set<PhoneNumber> getPhones() { return phones; } 

******中国

@ManyToMany(mappedBy="phones") 
public Set<Customer> getCustomers() { return customers; } 

的属性的mappedBy尚未在Customer@ManyToMany定义!有没有我不知道的双向映射的默认值,或者是什么?

我看着类似的情况,结果发现: @OneToOne - 的mappedBy是可选的,没有默认 @OneToMany - 完全一样@ManyToMany(的mappedBy是可选的双向,没有默认值)

总之,我的问题: 对于@ManyToMany@OneToMany,应该在关系的拥有方(例如Customer)的mappedBy属性中放置什么?

回答

1

这远不是一个特例。每个双向关联都有一个所有者和一个反面。

JPA使用拥有方来决定两个实体之间是否存在关联。另一面被忽略。

拥有方是定义如何映射关联的方法(使用JoinColumn,JoinTable等注释)。它没有任何mappedBy属性。

反面使用mappedBy属性来说:“嘿,我只是由以下属性映射的属性的反向关联”。

因此,根据定义,拥有方没有mappedBy属性。如果它有一个,它不会是拥有方。

这在JPA spec中有很好的解释。如果您需要为此规范构建一个兼容套件,最好阅读并理解它。

我实在不明白写这样的合规性套件的点,因为正如写在JPA2 JSR home page

由于所需的Java规范参与协议(JSPA), Java持久性API的,版本2.0 TCK将被授权在没有 收费没有支持合格的非营利实体。这种 资格将通过兼容性测试 奖学金计划进行验证。支持也可免费提供,奖学金委员会批准 。欲了解更多信息,请参阅 至:http://java.sun.com/scholarship/

+0

该兼容工具包只是JPA使用的注释的单元测试的花哨名称。现在关注ORM ......你是说这些单元测试(或者其他的东西)已经存在了吗?我正在实习的公司希望我将其作为测试其开源应用程序的一部分来开发。 我有点了解'mappedBy'的用法,我只是对其确切的措辞感到困惑。为什么说mappedBy注释对于非单向关系是必需的而不排除双向关系的拥有方? – Pimgd 2012-02-14 18:19:33

+0

TCK用于测试JPA实现。它不用于测试使用JPA构建的应用程序。所以我想你的套件可能会有用。它可能会这样说,因为开发人员很懒,并且认为注释的用户会读取JPA规范或注释本身的javadoc,其中详细解释了mappedBy属性的使用。 – 2012-02-14 18:27:29

+0

“,其中详细解释了mappedBy属性的使用。”你能给我一个这个文档的链接吗?我可以在网上找到它的一些,但它似乎鹦鹉在JSR-317规范中可以阅读的内容......并没有揭示这种特殊情况。 – Pimgd 2012-02-14 18:37:24