Hibernate如何处理规范化数据库



初步信息
我目前正在尝试将Hibernate与我的团队集成。我们主要从事Java web开发,创建向客户端提供数据的web应用程序。我们的旧方法包括使用JDBC调用存储过程(位于Oracle框的顶部),并将其结果存储在bean中。然而,我听说了很多关于将Hibernate集成到像我们这样的开发环境中的好处,所以我试图摆脱我们的旧习惯。注意:为了团队采用,我使用Hibernate JPA注释方法非常简单
特定问题
我目前遇到的特定问题是将Hibernate与规范化表一起使用。我们有很多这样结构的模式:

StateCodes (integer state_code, varchar state_name)
Businesses (integer business_id, varchar business_name, integer state_code)

我希望能够有一个拥有所有"Businesses"字段的@Entity,除了它有"state_code"而不是"state_name"。据我所知,Hibernate将@Entity类视为表。@OneToMany、@OneToOne、@ManyToOne注释创建实体之间的关系,但这是一个非常简单的、类似字典的查找,我觉得它不适用于这里(或者可能有些过头了)。

我见过的一种方法是

@Formula("(select state_name from StateCodes where Businesses.state_code = state_code)")
private String stateCode;

但是,考虑到Hibernate"避免编写原始SQL"的好处,这似乎是一种糟糕的做法。更不用说,我对Hibernate将如何处理这个字段感到非常困惑。是否在保存操作中保存?毕竟,它只是被定义为一个查询,而不是一列。

那么,实现这一目标的最佳方式是什么呢?

在这种情况下,我看不出有任何理由不使用标准JPA映射。如果不创建数据库视图并将实体映射到该视图(或使用不符合JPA的@Formula),则必须按以下方式进行映射。

除非你为国家的改变提供了一种手段,否则你不需要向外界公开国家实体:JPA提供者不需要getter/setter在场。。也不需要将州映射到企业:

@Entity
@Table(name = "Businesses")
public class Business{
//define id and other fields
@ManyToOne
@JoinColumn(name = "state_code")
private State state;
public String getStateName(){
return state.getName();
}
}

@Entity
@Table(name="StateCodes")
public class State{
//define id and other fields.
@Column(name = "state_name")
private String stateName;
public String getStateName(){
return stateName;
}
}

最新更新