我正在使用javax.persistence包来映射我的Java类.
我有这样的实体:
public class UserEntity extends IdEntity {
}
它扩展了一个名为IdEntity的映射超类:
@MappedSuperclass
public class IdEntity extends VersionEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
// Getters and setters below...
}
IdEntity超类扩展了另一个名为VersionEntity的映射超类,使所有实体都继承了版本属性:
@MappedSuperclass
public abstract class VersionEntity {
@Version
private Integer version;
// Getters and setters below...
}
为什么?
因为现在我可以在所有实体的IdEntity类上进行泛型查询,它看起来像这样:(示例)
CriteriaBuilder builder = JPA.em().getCriteriaBuilder();
CriteriaQuery criteria = builder.createQuery(IdEntity.class);
现在来问题了.
我的一些实体将具有created_at和deleted_at等时间戳.但并非所有实体.
我可以在我的实体类中提供这些属性,如下所示:
public class UserEntity extends IdEntity {
@Basic(optional = false)
@Column(name = "updated_at")
@Temporal(TemporalType.TIMESTAMP)
private Date updatedAt;
}
但由于我有很多实体,这将使我在所有应该有时间戳的实体中放入大量冗余代码.我希望有一些方法可以让相关的类以某种方式继承这些字段.
一种可能的解决方案是创建一个并行的IdEntity超类,可能名为IdAndTimeStampEntity,并使那些应该有时间戳的实体继承这个新的超类,但是这对我的同事开发人员来说是不公平的,因为现在他们必须知道选择哪个超级类从编写通用查询时:
CriteriaBuilder builder = JPA.em().getCriteriaBuilder();
CriteriaQuery??> criteria = builder.createQuery(???); // Hmm which entity should I choose IdEntity or IdAndTimeStampEntity ?? *Annoyed*
并且通用实体查询变得不那么通用了..
My question: How can I make all of my entities inherit id and
version fields, but only a sub part of all entities inherit
timestamp fields, but keep my queries to a single type of entities?
更新#1
来自Bolzano的问题:“您可以添加为实体指定路径(保存表信息)的代码吗?”
这是一个查询UserEntity的工作示例,它是一个IdEntity
CriteriaBuilder builder = JPA.em().getCriteriaBuilder();
CriteriaQuery criteria = builder.createQuery(IdEntity.class);
Root from = criteria.from(IdEntity.class);
criteria.select(from);
Path idPath = from.get(UserEntity_.id); //generated meta model
criteria.where(builder.in(idPath).value(id));
TypedQuery query = JPA.em().createQuery(criteria);
return query.getSingleResult();