初步信息
我目前正在尝试将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)
我希望能够拥有一个包含所有“业务”字段的@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如何对待这个领域感到困惑。它是否在保存操作中保存?毕竟,它只是被定义为一个查询,而不是一个列。
那么实现这个目标的最佳方法是什么?
答案 0 :(得分:1)
在这种情况下,我认为没有任何理由不使用标准的JPA映射。如果没有创建数据库视图并将实体映射到该视图(或使用非JPA兼容的@Formula),那么您将必须如下映射。
除非您提供更改国家的手段,否则您不需要将国家实体暴露给外界:JPA提供商不需要存在getter / setter ..您也不需要映射a陈述企业:
@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;
}
}