0

我有这个 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,我应该找到项目中对标签“描述”的所有引用,包括 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%>" />

但我会知道是否存在击球手的方式来做到这一点。

谢谢。

4

1 回答 1

1

我从事过使用静态字符串的项目,如下所示 - 正如您所建议的:

public static final String DESCRIPTION = "description";

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

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

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

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

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())

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

于 2013-10-29T14:42:58.543 回答