2014-11-06 46 views
1

嘿我想要通過從db類型的長型元素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); 
    } 
} 

但將由子模型類I'have擴展到動態聲明實體類的名字在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(); 
} 

和我的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

+0

這是我很難了解你想做什麼。 – huidube 2014-11-06 15:29:47

+0

我想有通用的實體類,我會有像getById()這樣的常用方法。那個泛型類將被混合實體類擴展。我不必在每個模型類中寫入相同的方法,因爲它將繼承自泛型類 – masterdany88 2014-11-07 13:18:01

回答

3

您不能在靜態方法中使用泛型參數(請參閱https://stackoverflow.com/a/936951/1643132更多細節),所以你將不得不從getBy()方法中刪除靜態關鍵字。

第一步,能不能介紹一下你的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; 
    } 
} 

你的孩子實體可能看起來像:

+0

我已經使您指向了我,並且它像一個魅力一樣工作。但我需要一個DAO接口和該接口的DAO實現類。你能給我一些建議嗎? – masterdany88 2014-11-08 14:14:11

+0

這篇文章幫了我很多:[鏈接](http://stackoverflow.com/questions/26288373/spring-mvc-generic-dao-and-service-classes) – masterdany88 2014-11-08 19:21:16

+0

Manuel Verriez can你看看這篇文章:http: //stackoverflow.com/questions/26846192/java-multiplay-level-inheritance-of-abstract-java-class-with-reflection – masterdany88 2014-11-10 14:38:48

0

這是我工作的代碼。希望可以幫助別人: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 {}