2014-11-21 50 views
8

。在這個項目中我有兩個模型,我想創建一個OneToOne之間的關係。遊戲框架,OneToOne關係我使用<a href="https://www.playframework.com/" rel="nofollow noreferrer">Play Framework</a>(Java的香味)的一個項目不工作

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

User model code
UserLegalName model code

的問題是UserUserLegalName不縫得到 「相關的」
UserLegalName Table
user_user_id列始終NULL。我曾嘗試JoinColumn(name = "user_id")UserLegalNameUser但這並不工作,要麼
UserLegalName Table

編輯:

採取@Sivakumar答案和修復我的代碼UserLegalName後現在用於存儲正確 UserLegalName Table
然而,當我試圖獲得用戶的UserLegalName,它仍然變成null

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

它返回

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

編輯2:

您可以在User模型添加fetch=FetchType.EAGEROneToOne註釋,並且每次都會獲取UserLegalName。但實際上User模型要複雜得多。它擁有更多的關係。

有沒有不同的方法來做到這一點?通過保持提取類型爲EAGER它可能會創建效率低下的查詢(例如:我只想要用戶郵件,在一個單獨的表中,但它也查詢User_Legal_Name表)

+0

你試過從http://stackoverflow.com/questions/8560988/onetoone-mapping-play-framework-enitity解決方案? – Beri 2014-11-25 08:53:52

+0

這個問題應該在你的代碼中,而不是映射,所以告訴我們你用來保存UserLegalName的代碼。還請在你的問題中顯示你應該從哪些數據庫表中獲取數據。 – 2014-11-25 09:10:14

+0

請注意,我首先回答,指出正確保存實體。 – 2014-11-27 16:28:53

回答

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) 
+0

你會如何從數據庫中查詢這個?目前我正在做'User.find.fetch(「legalName」)。where()。eq(「userId」,「...」)。findUnique()'但'legalName'仍然爲空。但是,如果我查詢'UserLegalName'表'user_id'是'...'它將工作。 – 2014-11-26 21:58:19

+0

@NoahHuppert我用附加的代碼片段更新了我的答案以檢索用戶。 – Sivakumar 2014-11-27 06:50:06

+0

這不縫工作。請參閱編輯的問題以獲取更多信 – 2014-11-27 16:25:15

0

我想你只設置關係的一方,而不是兩者。當你有一個雙向的關係,你應該將它們都堅持/合併,像以前一樣:

userLegalName.setUser(user); 
user.setUserLegalName(userLegalName); 
entityManager.persist(userLegalName); 
entityManager.persist(user); 
相關問題