有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPA OneToOne关系

我正在使用Play框架构建一个项目,我很难理解JPA

我目前有两门课:


用户对象

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

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

然而,当我尝试使用上述代码在UserSettings中设置userId时,我收到以下异常:

一个javax。坚持不懈已捕获PersistenceException,组织。冬眠PropertyAccessException:无法通过读取器的反射getter获取字段值。使用者id

有人能帮我解释一下我怎样才能达到我想要的目标吗


共 (1) 个答案

  1. # 1 楼答案

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