如何定义jpa中可能不存在的关系?

如何定义jpa中可能不存在的关系?,jpa,relationship,Jpa,Relationship,假设我有一个表项,其列名为user_id,表用户和另一个名为Superuser: 创建表Itemid int,user_id int。。; 创建表Userid int。。; 创建表Superuserid int。。; 现在,所有项目都有一个用户条目,但只有一些项目有一个超级用户条目,即Item.User\u id==User.id始终和Item.User\u id==Superuser.id是可选的 我可以匹配用户部分,但我不知道如何映射超级用户部分。例如,这不起作用: @Entity publ

假设我有一个表项,其列名为user_id,表用户和另一个名为Superuser:

创建表Itemid int,user_id int。。; 创建表Userid int。。; 创建表Superuserid int。。; 现在,所有项目都有一个用户条目,但只有一些项目有一个超级用户条目,即Item.User\u id==User.id始终和Item.User\u id==Superuser.id是可选的

我可以匹配用户部分,但我不知道如何映射超级用户部分。例如,这不起作用:

@Entity
public class Item {
    @ManyToOne(optional = true)
    @JoinColumn(name = "user_id")
    private Superuser su;
    ...
这只允许user\u id为NULL,但我始终有一个user\u id。
我需要告诉jpa,即使有外键,超级用户表上也可能没有匹配的条目。

我设法解决了最具体的问题,因为我使用hibernate作为jpa后端。 Hibernate为这种情况提供了一个精确的注释:

默认情况下,当Hibernate无法解析关联,因为预期的关联元素不在“关联”列上的数据库错误id中时,Hibernate会引发异常。这可能会给Leccy和维护不好的模式带来不便。您可以要求Hibernate忽略这些元素,而不是使用@NotFound注释引发异常。此批注可用于具有FK、@ManyToOne、@OneToMany或@ManyToMany关联的@OneToOne

因此,Hibernate解决方案如下所示:

@Entity
public class Item {
    @ManyToOne(optional = true)
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(name = "user_id")
    private Superuser su;
    ...

我仍然想知道JPA规范是否接受了其他方法。

让我们从SQL数据库模型开始。。。我们是否可以假设您的项表包含两个外键:user_id int NOT NULL always和superuser_id int optional?@wypipeprz No,正如伪DDL中定义的,项中只有一个外键,user中有一个始终匹配的主键,superuser中有一个可选项。听起来更像是模型应该在项类中有一个user类型的字段,超级用户扩展了User,这样,如果相关对象是一个User,那么它就得到了User,如果它是一个Superuser,那么它就得到了Superuser对象。我不确定我是否理解正确,但是,您想引用两个表User和Superuser,并使用一个User\u id列,并且给定的项应该引用User或Superuser表?如果是,您可以通过JPA的继承功能来实现这一点。@NeilStockton很有趣,尽管USer和Superuser不相关,即它们不共享公共字段。仅供参考,关系已经存在,我正在尝试为遗留系统建模