2014-11-06 5 views
1

안녕하세요, db에서 long 요소 유형의 ID로 다운로드 할 일반 모델/엔티티 클래스를 갖고 싶습니다. 그 방법은 다음과 같이이다 : DAO 인터페이스 및 구현을 사용하여 일반 Abstract Entity 클래스 구현

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에서 찾을 엔티티 클래스 이름을 선언하는 아동 모델 클래스 I'have으로 연장됩니다 일반 모델

.

getById()와 같은 공통 메소드가있는 generic 엔티티 클래스를 갖고 싶습니다. 그리고 그 일반 클래스는 Concret 엔터티 클래스에 의해 확장 될 것입니다. 각 모델 클래스에 동일한 메소드를 쓰지 않아도되므로 일반 클래스에서 상속됩니다. -

어떻게해야합니까?

여기 내 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; 
    } 

} 

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 구현 클래스가 한 번 더 나에게 몇 가지 추가 도움을주십시오 : D

+0

당신이하고 싶은 것을 이해하십시오. – huidube

+0

getById()와 같은 공통 메소드가있는 일반 엔티티 클래스를 갖고 싶습니다. 그리고 그 일반 클래스는 Concret 엔터티 클래스에 의해 확장 될 것입니다. 각 모델 클래스에 동일한 메소드를 작성하지 않아도되므로 일반 클래스에서 상속받습니다. – masterdany88

답변

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 클래스를 검색 할 수 있습니다. 여기 내 작업 코드

@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; 
    } 
} 
+0

나는 당신이 나를 지적하고 매력처럼 작동하는 방식으로 만들었습니다. 하지만 그 인터페이스의 DAO 인터페이스와 DAO 구현 클래스가 필요합니다. 나에게 조언을 해줄 수있어? – masterdany88

+0

이 게시물은 많은 도움이되었습니다. [link] (http://stackoverflow.com/questions/26288373/spring-mvc-generic-dao-and-service-classes) – masterdany88

+0

Manuel Verriez이 게시물을보실 수 있습니다 : http : //stackoverflow.com/questions/26846192/java-multiplay-level-inheritance-of-abstract-java-class-with-reflection – masterdany88

0

:처럼 보일 수 있습니다

@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; 
    } 
} 

아이 엔티티 : 그래서 당신이 GenericModel 업데이트합니다.희망은 다른 사람 도움 : D

일반 모델/Entity 클래스를

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(); 
    } 
} 

내 노동 계급 예 : 고객 모델/Entity 클래스

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 {} 
관련 문제