我的 Spring 应用程序中有不同的用户类型。我实现了某种继承。所有用户类型都从 User 类扩展而来。我认为这里有两张表就足够了:
“用户”将有: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] 删除。
我来说两句