繁体   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