当前位置: 首页 > 知识库问答 >
问题:

包含OneToOne映射的映射类(OneToMany)的问题

支洋
2023-03-14

我一直试图通过一个名为Guardian的中间类映射两个用户之间的一些“OneToOne”关系。当我试图检索一个用户(和他的监护人)时,从Glassfish(Open edition V4.0)返回一个内部服务器错误。但是,日志中没有显示任何类型的堆栈跟踪或任何错误。我怀疑问题是我在JPA类中的映射。

启动服务器时,我得到两个与Guardian类有关的警告,但我并不真正理解:

警告:映射到元素[method getGuardianUserBean]上的引用列名[GUARDIAN]与映射引用上的有效id或基本字段/列不对应。将使用所提供的引用列名。

警告:映射到元素[method getOwnerUserBean]上的引用列名[OWNER]与映射引用上的有效id或基本字段/列不对应。将使用所提供的引用列名。

SQL create语句:

create table HOMEFREE."user" (
    userid integer GENERATED ALWAYS AS IDENTITY,
    name varchar(255) not null,
    displayname varchar(255) unique not null,
    password varchar(255) not null,
    tlf integer,
    facebookID varchar(255),
    googleid varchar(255),
    authtoken varchar(255),
    email varchar(255) unique not null,
    primary key(userid)
);

create table HOMEFREE."guardian" (
    guardianId integer GENERATED ALWAYS AS IDENTITY,
    owner integer not null,
    guardian integer not null,
    confirmed boolean not null,
    primary key(guardianId),
    foreign key(owner) references homeFree."user"(userid),
    foreign key(guardian) references homeFree."user"(userid)
);

实体类中的相关字段/注释:

@Entity
@Table(name = "\"user\"", schema = "HOMEFREE")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int userId;

    @OneToMany(mappedBy = "ownerUserBean", fetch = FetchType.EAGER)
    private List<Guardian> guardians;
}

@Entity
@Table(name="\"guardian\"", schema="HOMEFREE")
public class Guardian implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int guardianId;

    @OneToOne
    @PrimaryKeyJoinColumn(name="OWNER", referencedColumnName="USERID")
    private User ownerUserBean;

    @OneToOne
    @PrimaryKeyJoinColumn(name="GUARDIAN", referencedColumnName="USERID")
    private User guardianUserBean;

    private boolean confirmed;  
}

共有1个答案

昝浩阔
2023-03-14

请尝试使用@joincolumn而不是@primarykeyjoincolumn

@OneToOne
@JoinColumn(name="OWNER", referencedColumnName="USERID")
private User ownerUserBean;

@OneToOne
@JoinColumn(name="GUARDIAN", referencedColumnName="USERID")
private User guardianUserBean;

根据规范,后者应用于在joined映射策略中将实体子类的主表连接到其超类的主表(确切定义在这里可用)

 类似资料:
  • 问题内容: 我正在尝试使Hibernate @OneToOne注释正常工作,并且在这里没有太大的成功… 假设我有一个名为的表格,看起来像这样: 我有一个看起来像这样的实体: 还有一个类似的,另一个实体看起来像这样: 当我进行读取时,我希望它将返回带有的对象。相反,我得到一个AnnotationException:“引用的属性不是(One | Many)ToOne:mappedBy User.sta

  • 我在使用模型映射器使用执行父子实体更新时遇到了一个问题。 描述如下 父类: 儿童班: 通过这种安排,我能够成功地创建和查询站点地址组合。但是,我在进行更新时遇到了一个问题。我正在尝试使用modelmapper语句更新站点或地址,如下所示: 期望在传入站点中更改的所有字段(即来自请求的站点)应替换站点中的现有字段。但是,我从modelmapper中得到一个Stackoverflow错误。 我们是否有

  • 我想询问一个人,并得到以下回应: 但在需要时,我还想包含字段,并获得如下内容: 但是,我得到的只是手机ID,就像这样: 这是两个有问题的领域:

  • 我正在使用JPA编写一个Java EE应用程序,它需要国际化。为此,我创建了一个名为multilingarstring的类,该类将语言与字符串相关联(并扩展了HashMap 现在,假设我们有一个实体,它根据语言的不同有不同的名称: 此代码生成以下数据库模式: 这几乎是好事。 此实现的问题是重复字段上的和方法上的(每次需要在数据库BTW中映射时都必须重新编写:每个实体类至少1个)。在我看来,它使代码

  • 我有2个实体:Field和ViewOptions 省略与问题无关的字段和方法

  • 问题内容: 假设我有个人 和工作 提取时,我无法将Person和Job映射到其他实体。 我在做什么错? 问题答案: 您的代码应为: (尝试从工作中删除重复的列’person_id’) 或其他共享主键的方法: