关于Hibernate关联对象中如何优化缓存?

p2ng 发布于 2015/06/04 14:02
阅读 529
收藏 0
@JsonAutoDetect
@Entity
@Table(name = "T_PIPELINE")
public class Pipeline extends BaseEntity {

    /**
     * 关联站场
     */
    private StationYard stationYard;

    /**
     * 站场名称,非持久化
     */
    private String stationYardName;

    @JsonIgnore
    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "I_STATION_YARD_ID", nullable = false)
    public StationYard getStationYard() {
        return stationYard;
    }

    public void setStationYard(StationYard stationYard) {
        this.stationYard = stationYard;
    }

    @Transient
    public String getStationYardName() {
        return this.stationYard.getName();
    }
}


实体设计如上所示,通过Hibernate查询Pipeline对象是也会关联查询出stationYardName(因为部分界面需要用到)

Pipeline与stationYard都有Ehcache的缓存中。

能不能优化查询不发出查询stationYard的SQL。还是数据表设计冗余多一个stationYardName的字段。

用上了Hibernate就是图它的方便,没有使用过ibatis/mybatis...


加载中
0
王勇鹏
王勇鹏

你这种写法是非常好的,也是符合面向对象思想的,既然用hibernate,就不要在纠结于以前的应付数据库的开发了。

你不用管它换没缓存啊,如果站在面向对象的思想上,就是这样写啊,你想要知道stationYard的name,就得先找到stationYard对象。直接通过数据库查询name不符合面向对象的思想啊。

p2ng
p2ng
是的,面向对象的设计思路。 这就是否Hibernate在小型应用上快速快发的体现麽。 业务单表,像提问一样关联一个对象,数据量在100w+级别,列表查询100条,时间在2's内,就是感觉有点慢,不知能怎么优化它了。
0
高山流水情
高山流水情

从数据库设计上来讲,这种表关系不建议做冗余。

中小型的系统用hibernate多一些关联查询,无所谓的,不必纠结。毕竟开发效率会提高不少。

如果真的需要优化,hibernate 可以查询单个字段,也可以连接查询,也可以直接写原生sql等等各种手段减少发出的sql语句。就看你对hibernate的掌握程度了。

p2ng
p2ng
是的,暂时简单封装过。单表查询基本不用写什么代码。效率真的提升不少。 现在业务单表,关联提问中的对象,数据量在100w+级别,列表查询100条时间在2's内。 写sql或者jpql的开发时间真的下降不少了。因为手上的项目主要做数据查询功能。业务表现在98个,每个表字段起码在26+起。或者明天我试试用这个【@Formula】注解让hibernate自动子查询,看会不会好些。
0
rabbitgg
rabbitgg
@Fetch(FetchMode.JOIN)  在manytoone底下加入以上这个,直接join查询获取数据。  你要的是这个吧
返回顶部
顶部