@ ManyToMany / @ OneToMany由双向关联的属性进行映射
我正在为我的实习工作一个JPA Compliancy工具包……该工具包的一部分涉及测试角落案例的正确实施。
@ManyToMany
有一个mappedBy属性。 JPA声明:
String mappedBy – 拥有该关系的字段或属性。 除非关系是单向的,否则是必需的。
没有给出默认值 – 默认列为空。
给定双向@ManyToMany
– 这个例子来自JPA 2.0 JSR-317规范本身!
顾客
@ManyToMany @JoinTable(name="CUST_PHONES") public Set getPhones() { return phones; }
电话号码
@ManyToMany(mappedBy="phones") public Set getCustomers() { return customers; }
尚未在Customer
的@ManyToMany
中定义mappedBy属性! 是否存在我不知道的双向映射的默认值,或者是什么?
我查看了类似的情况并发现: @OneToOne
– mappedBy是可选的,没有默认的@OneToMany
– 与@ManyToMany
(mappedBy对于双向是可选的,没有默认值)
简而言之,我的问题是:对于@ManyToMany
和@OneToMany
,应该在关系的拥有方(示例中为Customer
)的mappedBy属性中放置什么?
这远不是一个极端的案例。 每个双向关联都有一个所有者方和一个反方。
JPA使用拥有方来决定两个实体之间是否存在关联。 另一方被忽略了。
拥有方是定义关联如何映射的方(使用JoinColumn,JoinTable等注释)。 它没有任何mappedBy
属性。
反面使用mappedBy
属性来说:“嘿,我只是由以下属性映射的逆关联”。
因此,根据定义,拥有方没有mappedBy
属性。 如果它有一个,它将不是拥有方。
这在JPA规范中得到了很好的解释。 如果您需要为此规范构建合规工具包,则最好阅读并理解它。
我没有真正看到编写这样一个合规套件的重点,因为正如JPA2 JSR主页上所写,
根据Java规范参与协议(JSPA)的要求,Java Persistence API 2.0版TCK将在不支持合格的非营利实体的情况下免费获得许可。 此类资格认证将通过兼容性测试奖学金计划进行validation。 经奖学金委员会批准,也可免费提供支持。 有关更多信息,请访问: http : //java.sun.com/scholarship/ 。
- 如何在类路径中找到具有特定方法注释的所有类?
- Hibernate / JPA注释 – 未知实体
- @OneToOne(可选= false)和@JoinColumn(nullable = false)一起使用
- jackson – 必需的财产?
- java.lang.IllegalStateException:BindingResult和bean名称’category’的普通目标对象都不能作为请求属性使用
- 当注释具有参数时,CDI拦截器不起作用
- Spring:构造函数注入具有基于注释的配置的原始值(属性)
- BeanNotOfRequiredTypeException
- @Component和@Named都是同一个bean类