【问题标题】:Play Framework, OneToOne relationship not workingPlay Framework,OneToOne 关系不起作用
【发布时间】:2015-01-19 02:40:03
【问题描述】:

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

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

User model code
UserLegalName model code

问题在于UserUserLegalName 不适合“相关”

user_user_id 列始终为 NULL。我已经为UserLegalName 中的User 尝试了JoinColumn(name = "user_id"),但这也不起作用

编辑:

在接受@Sivakumar 回答并修复我的代码后,UserLegalName 现在可以正确存储
但是,当我尝试为用户获取 UserLegalName 时,它仍然出现 null

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

返回

{"userId":"f5ea6d1d-d22d-4127-b6e7-0b3d0446edfe","legalName":null}

编辑 2:

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

有没有其他方法可以做到这一点?通过将获取类型保持为EAGER,它可能会创建低效的查询(例如:我只希望用户的电子邮件在单独的表中,但它也查询User_Legal_Name 表)

【问题讨论】:

  • 你试过stackoverflow.com/questions/8560988/…的解决方案吗?
  • 问题应该出在您的代码中,而不是映射中,因此请向我们展示您用于保存 UserLegalName 的代码。还请在您的问题中显示您应该从哪些数据库表中获取数据。
  • 请注意我先回答,指向正确保存实体。

标签: java sql database jpa playframework


【解决方案1】:

我使用了您在上面链接中发布的两个模型并成功测试。正如@Andrei 在他的评论中提到的,问题不在于映射,它应该是你保存它们的方式。以下是我用来测试的代码sn-ps。

用户

@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;
    }
}

控制器

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)

【讨论】:

  • 如何从数据库中查询这个?目前我正在做User.find.fetch("legalName").where().eq("userId", "...").findUnique()legalName 仍然为空。但是,如果我查询user_id...UserLegalName 表,它将起作用。
  • @NoahHuppert 我用额外的代码 sn-ps 更新了我的答案来检索用户。
  • 那行不通。有关详细信息,请参阅已编辑的问题。
  • 在用户模型中包含 legalName 字段的获取类型。 @OneToOne(mappedBy = "user",fetch=FetchType.EAGER, cascade = CascadeType.ALL)
  • @NoahHuppert 将获取类型设置为EAGER 将立即获取子实体和父实体。希望这对你有用。
【解决方案2】:

我想你只设置了关系的一侧,而不是两者。由于您具有双向关系,因此您应该在持久化/合并之前同时设置它们,例如:

userLegalName.setUser(user);
user.setUserLegalName(userLegalName);
entityManager.persist(userLegalName);
entityManager.persist(user);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2018-10-01
    • 2021-01-01
    • 1970-01-01
    • 2012-01-06
    • 2015-08-08
    • 2015-06-22
    相关资源
    最近更新 更多