我已经为这个问题苦苦挣扎了一段时间,似乎无法在任何地方找到解决方案。也许我误会了一些东西,但是如果有人可以帮我清理一下,我将不胜感激。
我正在尝试在User.class和FacebookProfile.class之间创建一个OneToOne双向关系。
那就是我希望能够从FacebookProfile实体中查找相应的User实体,反之亦然:
userInstance.getFbprofile();
fbprofileInstance.getUser();
我的User.class:
@实体
@Access(值= AccessType.FIELD)
公共类用户实现UserDetails {
@OneToOne(mappedBy =“ user”)
私人FacebookProfile fbprofile;
}
我的FacebookProfile.class:
@实体
@Access(值= AccessType.FIELD)
公共类FacebookProfile {
@OneToOne(级联= CascadeType.ALL)
@JoinColumn(name =“ USER”)
私人用户用户;
}
新的FacebookProfile和User实例是在Controller中创建的,然后通过Service层发送到保留对象的DAO类。
我首先创建并保留一个新的User对象。
然后,我创建一个新的FacebookProfile并将新创建的用户(setUser)放入其中。然后,我坚持使用FacebookProfile对象。
用户ID现在存储在FacebookProfile数据库表中,但是没有用户到FacebookProfile的引用,因此以下代码返回NullPointerException:
用户tempUser = userService.findUserById(newUser.getId());
System.out.println(“ ID” + tempUser.getFbprofile()。getId());
如果不清楚,下面是来自Controller的代码:
//检查Facebook用户是否已经存在
FacebookProfile fbprofile = facebookProfileService.findFacebookProfileById(fbId);
用户newUser;
//创建一个新的FacebookProfile(如果不存在)
if(fbprofile == null){
//检查是否有用户注册了Facebook电子邮件
newUser = userService.findUserByEmail(fbEmail);
//没有用户,也没有FacebookProfile
if(!newUser.isEnabled()){
newUser =新的User();
newUser.setFirstname(fbFirstname);
newUser.setLastname(fbLastname);
//设置电子邮件
电子邮件=新的Email();
mail.setAddress(fbEmail);
mail.setName(“ Facebook”);
newUser.addEmail(mail);
//设置性别
if(fbGender.equalsIgnoreCase(“ female”)){
newUser.setGender(Gender.FEMALE);
}否则if(fbGender.equalsIgnoreCase(“ male”)){
newUser.setGender(Gender.MALE);
}
userService.createUser(newUser);
}
FacebookProfile newProfile =新的FacebookProfile();
newProfile.setId(Long.parseLong(fbId));
newProfile.setUsername(fbUsername);
newProfile.setFirstname(fbFirstname);
newProfile.setLastname(fbLastname);
newProfile.setName(fbName);
newProfile.setEmail(fbEmail);
if(!fbHometown.equals(“”)){
newProfile.setHometown(fbHometown);
newProfile.setHometownID(Long.parseLong(fbHometownID));
}
if(!fbLocation.equals(“”)){
newProfile.setLocation(fbLocation);
newProfile.setLocationID(Long.parseLong(fbLocationID));
}
newProfile.setLink(fbLink);
if(fbGender.equalsIgnoreCase(“ male”)){
newProfile.setGender(Gender.MALE);
}否则,如果(fbGender.equalsIgnoreCase(“ female”)){
newProfile.setGender(Gender.FEMALE);
}
newProfile.setUser(newUser);
this.facebookProfileService.createNewFacebookProfile(newProfile);
//newUser.setFbprofile(newProfile);
} else {//已经存在一个FacebookProfile
newUser = fbprofile.getUser();
}
我觉得我已经尝试了所有可能的解决方案,但是还没有奏效。
我怀疑在我的较早尝试中,fbprofile引用是在User对象中设置的,但是由于它是在User对象持久化之后设置的,因此从未持久化。我正在使用JPA2和EclipseLink。
如果有人对此有解决方案,将不胜感激。
最佳答案
JPA不维护双向关系。 JPA设计师曾认为维护双向关系会导致死锁和不一致。Toplink在JPA之前就支持双向关系。 。您应该手动维护双向关系。
newProfile.setUser(newUser);
newUser.setFbProfile(newProfile);
编辑:
好吧,您想让我详细说明一下答案。您应该更改保留FbProfile实体的代码,例如;
newProfile.setUser(newUser);
newUser.setFbprofile(newProfile);
this.facebookProfileService.createNewFacebookProfile(newProfile);
或者,您也可以更改FbProfile setUser方法;
public void setUser(User aUser) {
if (this.user==aUser)
return;
if (this.user != null) {
this.user.setFbProfile(null);
}
this.user = aUser;
if (this.user!=null) {
this.user.setFbprofile(this);
}
}