我已经为这个问题苦苦挣扎了一段时间,似乎无法在任何地方找到解决方案。也许我误会了一些东西,但是如果有人可以帮我清理一下,我将不胜感激。

我正在尝试在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);
       }
    }

10-06 12:57