0

基本的な 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;
    }
        // ...

私がやりたいことを理解していただければ幸いです。すべて同じ基本クラスから継承するさまざまな種類のクラスの汎用リポジトリ。ベスト プラクティスの例を教えてください。=)

よろしくお願いします

4

2 に答える 2

1

ジェネリック定義を変更して、E は Photo から拡張された任意の型でなければならないことを示します。次に、タイプ E の変数で Photo クラスのメソッドにアクセスできるようになります。

@Stateless
@LocalBean
public class PhotoRepository<E extends Photo> {

次のメソッドを使用して、実際のクラスを取得できます。

public Class getEntityClass() {
  ParameterizedType parameterizedType =
    (ParameterizedType) getClass().getGenericSuperClass();
 return (Class) parameterizedtype.getActualTypeArguments()[0];
}

spring を使用している場合は、spring-data-jpa も参照する必要があります。これは、そのような汎用リポジトリの実装を提供します。

于 2013-05-22T14:28:56.453 に答える
1

以下を使用して、エンティティから ID を取得できます。

entityManagerFactory.getPersistenceUnitUtil().getIdentifier(object);

merge() の前に find() を呼び出す必要はありませんが、merge() を呼び出すだけで、必要に応じて検索が実行されます。

于 2013-05-22T13:54:36.680 に答える