我正在使用该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<IdEntity> 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*
并且通用实体查询变得不那么通用..
我的问题:如何让
all
我的实体继承id
和version
字段,但只有所有实体的子部分继承时间戳字段,但将我的查询保留为单一类型的实体?
更新#1
来自 Bolzano 的问题:“您可以添加为实体指定路径(保存表信息)的代码吗?”
UserEntity
这是查询 a 的工作示例IdEntity
CriteriaBuilder builder = JPA.em().getCriteriaBuilder();
CriteriaQuery<IdEntity> criteria = builder.createQuery(IdEntity.class);
Root<IdEntity> from = criteria.from(IdEntity.class);
criteria.select(from);
Path<Integer> idPath = from.get(UserEntity_.id); //generated meta model
criteria.where(builder.in(idPath).value(id));
TypedQuery<IdEntity> query = JPA.em().createQuery(criteria);
return query.getSingleResult();