Hibernate 如何使用 InheritanceType.JOINED 区分对象类型

a4dev92

我的 Spring 应用程序中有不同的用户类型。我实现了某种继承。所有用户类型都从 User 类扩展而来。我认为这里有两张表就足够了:

  1. 表“用户” - 包含所有共享实体属性的列
  2. 表“users_corporate” - 包含 CorporateCustomer 类属性的列:companyName 和 VatNumber

“用户”将有:id、用户名、密码、名字、姓氏、电子邮件、手机、城市、街道、邮政编码

“users_corporate”将有:company_name, vat_number

类 RetailCustomer 和 Provider 没有任何带有 @Column 注释的字段,因此不需要为它们设置表,我只需要使用 OneToMany 映射声明字段..现在我想知道 hibernate 如何将 Provider 和 RetailCustomer 与每个字段区分开来其他,如果我在他们的班级中没有 @Table 注释。当我将使用 Spring Data 存储库并例如调用 providerRepository.findAll() 时,它现在如何将“用户”表中的哪些行是提供者,哪些是零售客户?它会起作用吗?我错过了什么吗?

基础实体:

@MappedSuperclass
public class BaseEntity{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
}

用户:

@Entity
@Table(name="users")
@Inheritance(strategy = InheritanceType.JOINED)
public class User extends BaseEntity{

    @Column(name = "username")
    private String userName;

    @Column(name = "password")
    private String password;

    @Column(name = "email")
    private String email;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Collection<Role> roles;

}

企业客户:

@Entity
@Table(name="users_corporate")
public class CorporateCustomer extends User{

    @Column(name = "company_name")
    private String companyName;

    @Column(name = "vat_number")
    private String vatNumber;

    @OneToMany(mappedBy = "customer")
    private List<Appointment> appointments;
}

零售客户:

@Entity
//@Table  <---- i think it is not needed here?
public class RetailCustomer extends User {

    @OneToMany(mappedBy = "customer")
    private List<Appointment> appointments;
}

供应商:

@Entity
//@Table  <---- i think it is not needed here?
public class Provider extends User{

    @OneToMany(mappedBy = "provider")
    private List<Appointment> appointments;

    @ManyToMany
    @JoinTable(name="works_providers", joinColumns=@JoinColumn(name="id_user"), inverseJoinColumns=@JoinColumn(name="id_work"))
    private List<Work> works;

    @OneToOne(mappedBy="provider", cascade = {CascadeType.ALL})
    private WorkingPlan workingPlan;
}
彼得沙利

如果我的类中没有 @Table 注释,hibernate 将如何区分 Provider 和 RetailCustomer?

如果您不使用@Table 指定表名,则表将与实体名称具有相同的名称。

当我调用 providerRepository.findAll() 时,它现在如何将“用户”表中的哪些行是提供者,哪些是零售客户?

如果从 ProviderRepository 中选择,休眠会生成inner join. 只会返回提供者实体。Hibernate 生成原生 SQL:

select ... from Provider p
inner join User u on p.id=u.id

为了选择所有用户使用 UserRepository,休眠将生成left join. 结果将包含所有可能的用户类型。Hibernate 生成原生 SQL:

select ..., 
case 
when r.id is not null then 1 
when p.id is not null then 2 
when u.id is not null then 0 
end as clazz_0_ 
from User u
left outer join Provider p on p.id=u.id 
left outer join RetailCustomer r on r.id=u.id

clazz_0_ helper 列区分将创建哪个实体类。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JPA Hibernate InheritanceType.JOINED SchemaManagementException

Hibernate InheritanceType.JOINED阻止创建表

使用InheritanceType.JOINED在Hibernate 5.3.6(JPA 2.1+)上引发IllegalArgumentException映射MySQL ENUM与AttributeConverter

如何区分对象类型C#

JPA InheritanceType.JOINED 如何写父类的关系实体

JPA /休眠分页-使用@Where的@Inheritance(strategy = InheritanceType.JOINED)的COUNT个查询错误

如何通过字节数组区分对象类型

如何区分对象列表

如何在打字稿中区分对象类型和数组类型

将继承策略从InheritanceType.JOINED转换为InheritanceType.SINGLE_TABLE时出现DuplicateMappingException

JPA /休眠-InheritanceType.JOINED的行为类似于InheritanceType.TABLE_PER_CLASS

休眠4:保留InheritanceType.JOINED鉴别符列值

如何基于多个属性区分对象

使用Jquery如何区分对象值是数组还是正值。

使用 Joined 继承时无法构建 Hibernate SessionFactory

Java / Hibernate JPA:InheritanceType.TABLE_PER_CLASS和ID

将具有InheritanceType.JOINED的实体添加到本机查询

如何在画布上的python中区分对象

kivy touch_move 如何区分对象?

DocumentDb CreateDocumentQuery <T>区分对象类型

如何拆分对象而不管其类型如何?

如何区分对象与静态字段和对象与非静态字段/变量

如何通过moxy区分对象null和json中未给出的对象

如何在不区分对象的情况下带圆圈解码ADT

如何使用Hibernate保存复杂的对象?

使用 JOINED 继承策略并设置 spring.jpa.properties.hibernate.jdbc.batch_size 时部分保存了实体

使用对象来区分联合类型

如何使用Hibernate / JPA将Oracle类型对象转换为Java对象?

使用内部联接使用Hibernate返回多个对象类型