基本的な CRUD 操作を実行するリポジトリを作成したいと考えています。
私はさまざまな種類の写真 (CompanyPhoto、CarPhoto、..) を持っているので、JPA リポジトリーを汎用にすることを好みますが、EJB サービスも同様にします。
これが私のクラスです:
@Entity
@Inheritance
@DiscriminatorColumn(name = "DESCRIMINATOR")
@Table(name = "PHOTOS")
public abstract class Photo {
public Photo() {
}
public Photo(String fileName) {
this.fileName = fileName;
// this.file = file;
}
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "PHOTOS_SEQ")
@TableGenerator(name = "PHOTOS_SEQ", table = "SEQUENCE", pkColumnName = "SEQ_NAME", pkColumnValue = "PHOTOS_SEQ", valueColumnName = "SEQ_COUNT", allocationSize = 50)
@Column(nullable = false)
private long id;
@Column(length = 255)
@Size(min = 0, max = 255, message = "{Photo.description.size}")
protected String description;
@Column(nullable = false, length = 255)
@NotNull(message = "{Photo.fileName.notNull}")
@Size(min = 1, max = 255, message = "{Photo.fileName.size}")
protected String fileName;
// ...
@Entity
@DiscriminatorValue("C")
public class CarPhoto extends Photo {
public CarPhoto() {
}
public CarPhoto(String fileName) {
super.fileName = fileName;
}
@ManyToOne(cascade = { CascadeType.DETACH })
@JoinColumn(name = "CARID", nullable = false)
@NotNull
private Car car;
// ...
@Entity
@DiscriminatorValue("P")
public class PersonPhoto extends Photo {
public PersonPhoto() {
}
public PersonPhoto(String fileName) {
super.fileName = fileName;
}
@ManyToOne(cascade = { CascadeType.DETACH })
@JoinColumn(name = "PERSONID", nullable = false)
@NotNull
private Person person;
// ...
@Stateless
@LocalBean
public class PhotoRepository<E> {
// In this class I would like to do create, remove, update and some basic find //operations..
@PersistenceContext
private EntityManager em;
public PhotoRepository() {
}
PhotoRepository(EntityManager em) {
this.em = em;
}
@Override
public E create(E photo) {
em.persist(photo);
return photo;
}
@Override
public E modify(E photo)
{
Class<E> photoClass;
// QUESTION: How am I going to call the getId() method from the object of type E class?
em.find(photoClass, photo.getId()); // This will not work.. =(
E mergedPhoto = em.merge(photo);
return mergedPhoto;
}
// ...
私がやりたいことを理解していただければ幸いです。すべて同じ基本クラスから継承するさまざまな種類のクラスの汎用リポジトリ。ベスト プラクティスの例を教えてください。=)
よろしくお願いします