Hibernate:映射两个实体

时间:2018-11-28 07:08:58

标签: java spring hibernate

我有一个关于根据实体表中的映射关系映射实体的问题。 因此,我们是一个由五个人组成的团队,致力于一个项目,我们的一个团队伙伴似乎在相反的方向之间添加表之间的映射,我将给出两个示例,以使您理解我的意思。

我们有两个表User和UserInfo。 UserInfo具有一个user_id作为外键。

1)我在休眠中了解的通用映射。

在User和UserInfo实体中,我通常具有如下映射:

class User{
   private int userId;
   private String userName;

   // getter and setters

}

class UserInfo{

   private int userInfoId;
   private String firstName;
   private String lastName;

   @OneToOne()
   @JoinColumn(name="user_id")
   private User user;

}

2)这是我的同事进行映射的方式:

class User{
   private int userId;
   private String userName;

   @OneToOne(mappedBy="user")
   @JoinColumn(name="user_id")
   private UserInfo userInfo;

   // getter and setters

}

class UserInfo{

   private int userInfoId;
   private String firstName;
   private String lastName;

   @OneToOne()
   private User user;

}

他所做的与我从教程中学到的恰恰相反。它以某种方式工作正常,但是我不确定这是否是映射两个实体的正确方法。 请帮忙。

谢谢。

3 个答案:

答案 0 :(得分:2)

它们两者都应该在数据库中创建完全相同的表,但是当您需要从userInfo调用user或从user调用userInfo时,第二种解决方案更好。

例如:

User user = ...
user.getUserInfo().getFirstName();

UserInfo info = ...
info.getUser().getUserName();

PS: 在本文中说,将@OneToOne与@MapsId一起使用最有效 https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/

答案 1 :(得分:2)

第二个代码段绝对可以正常工作,因为您没有使用双向关系。

如果您收到 JsonMappingException ,则只需使用以下代码即可 注释

  

您可以使用@JsonIgnore

答案 2 :(得分:1)

区别在于您的同事使用的是双向的,而您的同事是单向的。 双向关联可在两个方向上提供导航。如果在查询用户时需要userInfo对象,则需要双向。如果不是这种情况,那么您拥有的员工比同事的员工效率更高。

我建议您阅读此有用的链接,以了解如何有效地进行一对一映射: https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/