簡體   English   中英

使用dao接口和實現來實現通用抽象實體類

[英]Implement Generic Abstract Entity class with dao interface and implemantation

嘿,我想有一個通用的模型/實體類,該類/實體類將從數據庫中按long類型的id下載。 該方法是這樣的:

public class GenericModel   {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long id;

    public static GenericModel getBy(Long id) {
        return JPA.em().find(GenericModel.class, id);
    }
}

但是在將由子模型類擴展的泛型模型中,我必須動態聲明要在db中找到的實體類名稱。

我想擁有通用的實體類,在其中我將擁有諸如getById()之類的通用方法。 該通用類將由具體實體類擴展。 我將不必在每個模型類中編寫相同的方法,因為它將從通用類繼承–

我該如何實現?

這是我的DAO界面。 我不太確定:

public interface GenericModelDao<T> {
    public void add(T entityClass);
    public void update(T entityClass);
    public void delete(long id);
    public T get(long id);
    public List<T> get();
}

還有這個接口的My DAO實現類

 @Repository
public class GenericModelDaoImpl <T extends GenericModel> implements GenericModelDao {
    public Class<T> entityClass;

    GenericModelDaoImpl(){
        setEntityClass(((Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]));
    }
    public void setEntityClass(Class<T> entityClass) {
        this.entityClass = entityClass;
    }
    @Autowired
    private SessionFactory sessionFactory;
    private Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    }

    @Override
    public T get(long id) {
        return (T) getCurrentSession().get(entityClass, id);
    }
    @Override
    public void delete(long id) {
        T entityClass = get(id);
            getCurrentSession().delete(entityClass);
    }
    @Override
    public List<T> get() {
        return getCurrentSession().createQuery("from " + entityClass ).list();
    }
    @Override
    public void add(Object entityClass) {
        getCurrentSession().save(entityClass);
    }
    @Override
    public void update(Object entityClass) {
        getCurrentSession().update(entityClass);
    }
}

還有我的GenericModel類

@MappedSuperclass
public abstract class GenericModel<T extends GenericModel> {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long id;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

}

請再給我一些額外的幫助:D

您不能在靜態方法中使用泛型參數(有關更多詳細信息,請參見https://stackoverflow.com/a/936951/1643132 ),因此您將必須從getBy()方法中刪除static關鍵字。

第一步,您可以在GenericModel類中引入泛型:

public abstract class GenericModel<T extends GenericModel> {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long id;

    public T getBy(Long id) {
        return JPA.em().find(????, id);
    }
}

問題是,類似T.class的東西將無法工作(在getBy()方法中)。 感謝java.lang.reflect.ParameterizedType,您可以在運行時檢索T類。 因此,將GenericModel更新為:

@MappedSuperclass
public abstract class GenericModel<T extends GenericModel> {

    private Class<T> entityClass;

    GenericModel(){
        entityClass = ((Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long id;

    public T getBy(Long id) {
        return JPA.em().find(entityClass, id);
    }

    public Long getId() {
        return id;
    }
}

您的子實體可能看起來像:

@Table(name="child_model")
@javax.persistence.Entity
public class ChildModel extends GenericModel<ChildModel> {

    @Column
    private String data;

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

這是我的工作代碼。 希望可以幫助別人:D

通用模型/實體類

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;

@MappedSuperclass
public abstract class GenericModel<T extends GenericModel<?>> {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;

    public long getId() {return id;}
    public void setId(long id) {this.id = id;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}

}

GenericModelDao接口

import java.util.List;

public interface GenericModelDao<T> {
    public void add(T entityClass);
    public void update(T entityClass);
    public void delete(long id);
    public T get(long id);
    public T getByName(String name);
    public List<T> get();
}

GenericModelDaoImpl類

import java.lang.reflect.ParameterizedType;
import java.util.List;

import javax.persistence.MappedSuperclass;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import model.GenericModel;

@Repository
@MappedSuperclass
public abstract class GenericModelDaoImpl <T extends GenericModel> implements GenericModelDao<T> {
    GenericModelDaoImpl(){
        setEntityClass(((Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]));
    }

    public Class<T> entityClass;

    public Class<T> getEntityClass() {
        return entityClass;
    }
    public void setEntityClass(Class<T> entityClass) {
        this.entityClass = entityClass;
    }
    @Autowired
    private SessionFactory sessionFactory;
    private Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    }

    @Override
    public void add(T entityClass) {
        getCurrentSession().save(entityClass);
    }
    @Override
    public void update(T entityClass) {
        getCurrentSession().update(entityClass);
    }
    @Override
    public void delete(long id) {
        getCurrentSession().delete(get(id));
    }
    @Override
    public T get(long id) {
        return (T) getCurrentSession().get(entityClass, id);
    }
    @Override
    public T getByName(String name) {
        return (T) getCurrentSession().createQuery("FROM e " + entityClass.getSimpleName() + " WHERE name:=name").setParameter("name", name);
    }
    @Override
    public List<T> get() {
        return getCurrentSession().createQuery("FROM " + entityClass.getSimpleName() ).list();
    }
}

我的工人階級示例: 客戶模型/實體階級

import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name="common__Customer")
public class Customer extends GenericModel<Customer> {}

CustomerDao界面

import com.common.model.Customer;
public interface CustomerDao  extends GenericModelDao<Customer> {}

CustomerDaoImpl類

import org.springframework.stereotype.Repository;
import com.common.model.Customer;

@Repository
public class CustomerDaoImpl extends GenericModelDaoImpl<Customer> implements CustomerDao {}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM