2015-09-15 131 views
2

我正在开发JavaEE应用程序,并使用JPA/Hibernate作为持久性引擎。在开发应用程序时,我想到了一些问题。JPA /休眠ManyToMany vs双面OneToMany/ManyToOne

该应用程序由用户及其在N:M关系中的角色组成。这是上表的数据库子集。

enter image description here

我是比较新的休眠并在第一次我问IntelliJ IDEA的产生为我的映射。它的所作所为是生成以下Java类:

  • UserEntity.java
  • RoleEntity.java
  • UserXRoleEntity.java
  • UserXRoleEntityPK.java

因此,它生成的映射关系表和两个1:N关系,一个在useruserXrole之间,另一个在roleuserXrole之间。

经过一番研究,我发现,通过使用@ManyToMany注释,我可以省略userXrole表映射到Java类,只是标注为@JoinTable内申报。

所以,问题是:

  • 为什么的IntelliJ生成实体方式

它只是一个更通用的方式,有助于代或它有任何其他优点。你会赞成这种或那种方式吗?

回答

1

它只是一个更通用的方式,帮助生成,或者是否有任何其他优势。

JPA不知道表是否只是一个连接表,这就是为什么你必须告诉它(使用@JoinTable)。生成器可能会猜测,但如果您的表名称与JPA默认值匹配,它可能只会生成@ManyToMany

你会赞成这种方式吗?

我会使用@ManyToMany如果我没有理由单独的映射实体(超过懒/渴望获取也许更细粒度的控制?),主要是因为更少的代码=错误更少。

+0

感谢您的回复。您能否提供任何源链接,说明JPA的数据库命名约定? – errikos

+0

http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-eval-oth-JSpec/ - 对于本案2.10.4(pdf中的第48页) – duckstep