如何使用Hibernate保持列名(Java + jsp)的一致性?

时间:2013-10-29 12:03:12

标签: hibernate consistency

我有这个POJO:

Place.class:

@Entity
@Table(name="place")
public class Place {
    @Id @Column(name="idPlace")
    private Integer id;

    @Column(name="descr")
    private String description;

    // getter & setter
}

如果我想按地点描述过滤(例如)我在Dao实现中添加一个限制:

getSession().createCriteria(Place.class).add(Restrictions.like("description", "description-filter-value"));

此外,如果进入视图(例如:create.jsp)我想引用描述列,我写一个这样的输入:

<input type="text" name="description" />

如果将来我需要(出于各种原因)重命名字段description我应该找到项目中对标签的所有引用&#34; description&#34 ;,Java和jsp,并重命名它们;太丑陋无聊了。

有一种方法可以用一致的方式编写这段代码吗?

我想在Place.java中添加一个静态字段:

public static final String DESCRIPTION = "description";

并将之前的代码更改为:

getSession().createCriteria(Place.class).add(Restrictions.like(Place.DESCRIPTION, "description-filter-value"));

<input type="text" name="<%=Place.DESCRIPTION%>" />

但我知道是否存在一种击球方式。

感谢。

1 个答案:

答案 0 :(得分:1)

我已经处理了使用静态字符串的项目,如下所示 - 正如您所建议的那样:

public static final String DESCRIPTION = "description";

但是,这些仅用于访问数据访问层中的域模型属性,而不是表示层中的域模型属性。我个人觉得它很难看。

为了确保域和数据访问层之间的一致性,您可以查看使用Criteria API和JPA Metamodel,它允许强大的类型安全查询:随着域模型的更改,元模型也应自动更新以反映这些变化。

https://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/metamodel.html

这不是我真正使用的东西,因为我发现QueryDSL及其类似于强类型的基于Metamodel的查询更易于使用。因此,这可能是值得关注的JPA Criteria API的替代方案。例如,如果我有以下内容,其中QBooking是由QueryDSL自动生成的MetaModel'查询对象',则对域模型的任何更改(例如,名称重命名为firstname)都会自动反映在查询对象中:

QBooking.booking qb = QBooking.booking ;
bookingRepository.findAll(qb.accommodation.holiday.eq(holiday).and(
                   qb.status.eq(BookingStatus.CONFIRMED)), qb.skillLevel.level.asc(),
                                qb.user.surname.asc(), qb.user.forename.asc())

当然,这并不能确保表示层和域模型之间的一致性,但是我发现实际上字段的重命名(如果你首先给它们命名一点思考)往往会发生很少见。