我有一个关于根据实体表中的映射关系映射实体的问题。 因此,我们是一个由五个人组成的团队,致力于一个项目,我们的一个团队伙伴似乎在相反的方向之间添加表之间的映射,我将给出两个示例,以使您理解我的意思。
我们有两个表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;
}
他所做的与我从教程中学到的恰恰相反。它以某种方式工作正常,但是我不确定这是否是映射两个实体的正确方法。 请帮忙。
谢谢。
答案 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)
答案 2 :(得分:1)
区别在于您的同事使用的是双向的,而您的同事是单向的。 双向关联可在两个方向上提供导航。如果在查询用户时需要userInfo对象,则需要双向。如果不是这种情况,那么您拥有的员工比同事的员工效率更高。
我建议您阅读此有用的链接,以了解如何有效地进行一对一映射: https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/