使用dao接口和实现实现Generic Abstract Entity类

嘿我想有通用模型/实体类,可以从db下载类型为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); } } 

但是在子模型类中扩展的Generic模型中,我必须动态声明要在db中查找的实体类名。

我想有通用实体类,我将有常见的方法,如getById()。 该generics类将由concret实体类扩展。 我不必在每个模型类中编写相同的方法,因为它将inheritance自generics类 –

我怎么能得到这个?

这是我的DAO界面。 我不太确定:

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

和我的DAO实现类这个接口

  @Repository public class GenericModelDaoImpl  implements GenericModelDao { public Class entityClass; GenericModelDaoImpl(){ setEntityClass(((Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0])); } public void setEntityClass(Class 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 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 { @Id @GeneratedValue(strategy = GenerationType.AUTO) public Long id; public long getId() { return id; } public void setId(long id) { this.id = id; } } 

请再次给我一些额外的帮助:D

您不能在静态方法中使用generics参数(有关详细信息,请参阅https://stackoverflow.com/a/936951/1643132 ),因此您必须从getBy()方法中删除static关键字。

作为第一步,您可以在GenericModel类中引入generics:

 public abstract class 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 { private Class 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 { @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> { @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 { 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 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  implements GenericModelDao { GenericModelDaoImpl(){ setEntityClass(((Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0])); } public Class entityClass; public Class getEntityClass() { return entityClass; } public void setEntityClass(Class 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 get() { return getCurrentSession().createQuery("FROM " + entityClass.getSimpleName() ).list(); } } 

我的工作类示例: Customer Model / Entity类

 import javax.persistence.Entity; import javax.persistence.Table; @Entity @Table(name="common__Customer") public class Customer extends GenericModel {} 

CustomerDao界面

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

CustomerDaoImpl类

 import org.springframework.stereotype.Repository; import com.common.model.Customer; @Repository public class CustomerDaoImpl extends GenericModelDaoImpl implements CustomerDao {}