我在项目中使用Play Framework(Java风格)。在这个项目中,我有两个模型,我想在它们之间创建一个OneToOne关系。

我有一个User模型和一个UserLegalName模型。我希望每个User都有一个UserLegalName模型。

User model code
UserLegalName model code

问题是UserUserLegalName不接缝成为“相关”
user_user_id列始终为NULL。我已经尝试过将JoinColumn(name = "user_id")替换为User中的UserLegalName,但这也不起作用

编辑:

接受@Sivakumar答案并修复我的代码后,UserLegalName现在可以正确存储

但是,当我尝试为用户获取UserLegalName时,它仍然显示null

User.find.where().eq("userId", userId).findUnique()

哪个返回
{"userId":"f5ea6d1d-d22d-4127-b6e7-0b3d0446edfe","legalName":null}

编辑2:

您可以将fetch=FetchType.EAGER添加到OneToOne模型中的User批注中,并且每次都会获取UserLegalName。但是实际上User模型要复杂得多。它拥有更多的关系。

有其他方法可以做到吗?通过将获取类型保留为EAGER,可能会创建效率低下的查询(例如,我只希望用户在单独的表中发送电子邮件,但它还会查询User_Legal_Name表)

最佳答案

当您在上面的链接中发布并成功测试时,我使用了两种模型。正如@Andrei在评论中提到的那样,问题不在于映射,而应该是保存它们的方式。以下是我用于测试的代码段。

用户

@Entity
public class User extends Model{

    / ..... fields as it is in your post

    public User(String user_id){
        this.userId = user_id;
    }

    public static Finder<Long, User> find = new Finder<Long, User>(Long.class, User.class)

    public static User findByUserID(String user_id){

       /* Your models already in bi-directional relationship, so there is no need for external `fetch`, You can directly get `UserLegalName` object from `User`
               model if there is any match found on `UserLegalName` for the input.  */

       return find.where().eq("userId",user_id).findUnique();
    }
}

UserLegalName
@Entity
public class UserLegalName extends Model {

    / ..... fields as it is in your post

    public UserLegalName(User user_id, String first_name, String last_name){
        this.user = user_id;
        this.firstName = first_name;
        this.lastName = last_name;
    }
}

Controller
public class TestController extends Controller {

    public static Result insertUser(String user_id, String fname, String lname)
    {
        User user = new User(user_id);
        UserLegalName legal = new UserLegalName(user,fname,lname);
        user.legalName = legal;
        user.save();

        return ok(user.legalName.firstName);
    }

    public static Result getUser(String user_id)
    {
        User user = User.findByUserID(user_id);

        return ok(user.legalName.firstName);
    }
}

路线
GET      /test/:userID/:fname/:lname       controllers.TestController.insertUser(userID : String, fname : String, lname : String)

GET      /user/:userID       controllers.TestController.getUser(userID : String)

08-20 01:21