Hibernate如何使用规范化数据库?

时间:2015-04-28 15:39:10

标签: java hibernate jpa

初步信息
我目前正在尝试将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如何对待这个领域感到困惑。它是否在保存操作中保存?毕竟,它只是被定义为一个查询,而不是一个列。

那么实现这个目标的最佳方法是什么?

1 个答案:

答案 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;
    }
}