2014-11-21 13 views
8

Tôi đang sử dụng Play Framework (hương vị Java) cho một dự án. Trong dự án này, tôi có hai mô hình mà tôi muốn tạo ra một mối quan hệ OneToOne giữa.Khung chơi, mối quan hệ OneToOne không hoạt động

Tôi có mẫu User và kiểu UserLegalName. Tôi muốn mỗi User để có một mô hình UserLegalName.

User model code
UserLegalName model code

Vấn đề là các UserUserLegalName không đường may để bị "liên quan"
UserLegalName Table
Cột user_user_id luôn là NULL. Tôi đã cố gắng JoinColumn(name = "user_id") cho User trong UserLegalName nhưng điều này không làm việc, hoặc
UserLegalName Table

Edit:

Sau khi @Sivakumar câu trả lời và sửa lỗi trong code của tôi UserLegalName hiện đang lưu trữ một cách chính xác UserLegalName Table
Tuy nhiên khi tôi cố gắng để có được UserLegalName cho người dùng, nó vẫn bật lên null

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

nào trả

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

Sửa 2:

Bạn có thể thêm fetch=FetchType.EAGER đến OneToOne chú thích trong mô hình User và điều đó sẽ lấy UserLegalName mỗi lần. Tuy nhiên trên thực tế mô hình User phức tạp hơn nhiều. Nó nắm giữ nhiều mối quan hệ hơn.

Có cách nào khác để thực hiện việc này không? Bằng cách giữ loại tìm nạp là EAGER, nó có thể tạo truy vấn không hiệu quả (EX: Tôi chỉ muốn email người dùng, trong một bảng riêng biệt, nhưng nó cũng truy vấn bảng User_Legal_Name)

+0

Các bạn đã thử giải pháp từ http://stackoverflow.com/questions/8560988/onetoone-mapping-play-framework-enitity? – Beri

+0

Sự cố phải ở trong mã của bạn, không phải ánh xạ, vì vậy hãy hiển thị cho chúng tôi mã mà bạn sử dụng để lưu UserLegalName. Ngoài ra xin vui lòng hiển thị trong câu hỏi của bạn, từ những gì DB bảng bạn nên dữ liệu. –

+0

Xin lưu ý rằng tôi đã trả lời trước, chỉ để lưu chính xác các thực thể. –

Trả lời

2

Tôi đã sử dụng cả hai mô hình của bạn khi bạn đăng trong liên kết ở trên và thử nghiệm thành công. Như @Andrei đã đề cập trong bình luận của mình, vấn đề không nằm trong bản đồ, nó phải là cách bạn tiết kiệm chúng. Sau đây là các đoạn mã tôi đã sử dụng để thử nghiệm.

tài

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

khiển

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

đường

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

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

Bạn sẽ truy vấn điều này từ db như thế nào? Hiện tại tôi đang làm 'User.find.fetch (" legalName "). Where(). Eq (" userId "," ... "). FindUnique()' nhưng 'legalName' vẫn là null. Tuy nhiên nếu tôi truy vấn bảng 'UserLegalName' trong đó' user_id' là '...' nó sẽ hoạt động. –

+0

@NoahHuppert Tôi đã cập nhật câu trả lời của mình với các đoạn mã bổ sung để truy xuất người dùng. – Sivakumar

+0

Điều đó không có đường may hoạt động. Xem câu hỏi đã chỉnh sửa để biết thêm thông tin. –

0

Tôi cho rằng bạn chỉ đặt một bên của mối quan hệ, và không phải cả hai. Vì bạn có mối quan hệ hai chiều, bạn nên đặt cả hai trước khi duy trì/hợp nhất, như:

userLegalName.setUser(user); 
user.setUserLegalName(userLegalName); 
entityManager.persist(userLegalName); 
entityManager.persist(user); 
Các vấn đề liên quan