簡體   English   中英

JPA OneToOne 關系

[英]JPA OneToOne relationship

我正在使用 Play 框架構建一個項目,但我無法理解 JPA @OneToOne relationships

我目前有兩個課程:


用戶 Object

@Entity
@Table( name="users" )
public class Users extends Model {

    @OneToOne( mappedBy="userId", fetch=FetchType.LAZY, cascade = CascadeType.ALL )
    @ForeignKey( name="userId", inverseName="userId" )
    UserSettings userSettings;
    public userId;
    public userName;
}


用戶設置

@Entity
@Table( name="user_settings" )
public class UserSettings extends Model {

    @OneToOne( cascade = CascadeType.ALL,targetEntity=User.class )
    public String userId;
    public String xml;

    public UserSettings( String userId ){
        this.userId = userId;
    }
}


這個想法是我試圖將User中的userId字段設置為UserSettings中的外鍵。 我嘗試了幾種不同的方法來實現這一點,但我的代碼總是拋出錯誤。 我收到的最常見錯誤是:引用的屬性不是 (One|Many)ToOne

但是,當我嘗試使用上面的代碼在UserSettings中設置userId時,我收到以下異常:

一個 javax.persistence.PersistenceException 已被捕獲,org.hibernate.PropertyAccessException: could not get a field value by reflection getter of reader.User.id

任何人都可以幫助解釋我如何實現我想要的目標嗎?

閱讀 hibernate 參考資料的第 5.2 節,了解實體和值之間的差異。 您正在嘗試將 map 字符串作為實體。 正如錯誤告訴您的那樣,只有實體可以是 (One|Many)ToOne。 即,您應該使用User user而不是String userId ,而不是mappedBy="userId"mappedBy="user"

如果你擴展 Model,Play 默認會為每個實體生成一個主鍵“id”。 如果這不是您想要的,您應該改為擴展 Generic model。

最簡單的方法是將 user 作為用戶設置的屬性:


@Entity
@Table( name="user_settings" )
public class UserSettings extends Model{
    @OneToOne
    public Users user;
...

@Entity
@Table( name="users" )
public class Users extends Model {
    @OneToOne(cascade = CascadeType.ALL)
    public UserSettings settings;

使用 OneToOne 在每個實體中維護 User 和 UserSettings 允許您進行雙向搜索。
如果您想使用您自己的密鑰從 Model 更改為 GenericModel 並在用戶 object 上定義您的外鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM