パッケージを使用し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
考えられる解決策の 1 つは、おそらく名前を付けた並列スーパークラスを作成し、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 である 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();