我正在为项目使用Play Framework(Java风格)。在这个项目中,我有两个模型,我想在它们之间建立OneToOne
关系。
我有User
模型和UserLegalName
模型。我希望每个User
都有一个UserLegalName
模型。
User
model code
UserLegalName
model code
问题在于User
和UserLegalName
没有找到“相关”
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}
您可以将fetch=FetchType.EAGER
添加到OneToOne
模型中的User
注释中,每次都会获取UserLegalName
。但实际上User
模型要复杂得多。它拥有更多的关系。
有不同的方法吗?通过将获取类型保持为EAGER
,它可能会创建效率低下的查询(例如:我只希望用户在单独的表中发送电子邮件,但它也会查询User_Legal_Name
表)
答案 0 :(得分:2)
我使用了您在上述链接中发布的两个模型并成功测试过。正如@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;
}
}
<强>控制器强>
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)
答案 1 :(得分:0)
我想你只设置了关系的一面,而不是两者兼而有之。由于你有双向关系,你应该在持久化/合并之前设置它们,例如:
userLegalName.setUser(user);
user.setUserLegalName(userLegalName);
entityManager.persist(userLegalName);
entityManager.persist(user);