JPA OneToOne关系

时间:2011-07-21 11:10:52

标签: java hibernate jpa playframework

我正在使用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;
}


UserSettings

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


我的想法是,我尝试将userId中的User字段设置为UserSettings中的外键。我尝试了几种不同的方法来实现这一点,我的代码总是抛出一个错误。我收到的最常见的错误是: 引用的属性不是(一个|多个)ToOne

但是,当我尝试使用上面的代码在userId中设置UserSettings时,我收到以下异常:

已捕获到javax.persistence.PersistenceException,org.hibernate.PropertyAccessException:无法通过reader.User.id的反射getter获取字段值

有人可以帮助解释我如何实现我的目标吗?

2 个答案:

答案 0 :(得分:5)

阅读关于实体和值之间差异的hibernate参考的section 5.2。您正在尝试将String映射为实体。只有实体可以是(一个|多个)ToOne,因为错误告诉你。即,而不是String userId,您应该使用User user,而不是mappedBy="userId"mappedBy="user"

答案 1 :(得分:0)

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

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


@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维护每个实体中的用户和用户设置,可以进行双向搜索。
如果要将自己的密钥更改从Model更改为GenericModel并在用户对象上定义外键。