我有这个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%>" />
但我知道是否存在一种击球方式。
感谢。
答案 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())
当然,这并不能确保表示层和域模型之间的一致性,但是我发现实际上字段的重命名(如果你首先给它们命名一点思考)往往会发生很少见。