如何在Hibernate中将多个实体FK保存到单个属性?

时间:2017-03-19 19:53:59

标签: java hibernate hibernate-mapping

我有对象Car,嵌套对象User不能为null。

class Car {
    @Id
    int id;
    @NotNull
    User user;
}

但我想升级车辆也可以选择由公司拥有。汽车不能同时归两者所有。 Hibernate中是否有一个选项可以将Car中的FK用作用户和公司?这是一个例子:

class Car {
    @Id
    int id;
    @NotNull
    Owner owner; //Can be object type User or Comapny
}

我有意做出额外的对象UserRole,它可以选择嵌套用户和公司,但是我正在寻找更好的解决方案/优化,如果在Hibernate中有可能,则不需要额外的对象:

class Car {
    @Id
    int id;
    @NotNull
    UserRole owner; //Can be object type User or Comapny
}
class UserRole{
    @Id
    int id; // PK, that will be used in Car
    User user;
    Company company;
    int type; // determinates what if owner is User or Company
}

实施将用于存储API上的entites。 请建议它有更简单的方法。感谢。

2 个答案:

答案 0 :(得分:1)

首先,你说User不可空。然后你说同时CarUser不能同时拥有Company - 意味着User可以为空。

您不能对CompanyUser使用相同的字段。在Hibernate中,每个类都与一个实体相关联。所以我的建议是做

class Car {
    @Id
    int id;

    @ManyToOne
    User user;

    @ManyToOne
    Company company;
}

没有@NotNull注释,然后只检查是否为null。

第二个选项是使用继承(如果可能)。您可以创建名为@MappedSuperClass的{​​{1}},然后使CarHolderUser继承。那么你只能在Car里面只保留Owner个字段。

答案 1 :(得分:0)

您可以同时使用它们:

class Car {
    @Id
    int id;
    @NotNull
    User user;
    @NotNull
    Company company;
}

当您需要获得汽车的所有者时,只需检查user属性和company null属性即可。