【问题标题】:JPA OneToOne relationshipJPA 一对一关系
【发布时间】:2011-07-21 11:10:51
【问题描述】:

我正在使用 Play 框架构建一个项目,但我无法理解 JPA @OneToOne relationships

我目前有两个课程:


用户对象

@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

谁能帮助解释我如何实现我想要的目标?

【问题讨论】:

    标签: java hibernate jpa playframework


    【解决方案1】:

    阅读休眠参考中的section 5.2,了解实体和值之间的差异。您正在尝试将 String 映射为实体。正如错误告诉您的那样,只有实体可以是 (One|Many)ToOne。即,你应该使用User user,而不是String userId,而不是mappedBy="userId"mappedBy="user"

    【讨论】:

    • 谢谢瑞恩。我已经进行了更改,它现在再次编译。不过,我仍然对外键概念有疑问。当我更改usersave() 中的userId 字段时,此更改不会反映在UserSettings 中。这是我必须更新自己还是我错误地分配了外键?
    • @My Head:作为外键的目标,userId,按照惯例,应该是用户的主键。你不应该改变它。
    【解决方案2】:

    如果你扩展 Model,Play 默认会为每个实体生成一个主键“id”。如果这不是你想要的,你应该扩展通用模型。

    最简单的方法是将用户作为用户设置的属性:

    
    @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 并在用户对象上定义您的外键。

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多