java 调用超类属性_Java持久性映射了具有可选属性的超类

我正在使用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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值