2015-12-21 4 views
1

Я встречаю некоторые проблемы с genericDao и интерфейсом модели.Generic Hibernate Dao с объектом модели интерфейса

Я реализовал следующую GenericHibernateDao:

@Repository 
public abstract class GenericHibernateDao<T, PK extends Serializable> implements IGenericDao<T, PK> { 

@Autowired 
private SessionFactory sessionFactory; 

private Class<T> type; 

@SuppressWarnings({ "unchecked", "rawtypes" }) 
public GenericHibernateDao() { 
    Type t = getClass().getGenericSuperclass(); 
    ParameterizedType pt = (ParameterizedType) t; 
    type = (Class) pt.getActualTypeArguments()[0]; 
} 

public void setSessionFactory(SessionFactory sessionFactory){ 
    this.sessionFactory = sessionFactory; 
} 

@Transactional 
public T add(T obj){ 
    getSession().persist(obj); 
    return obj; 
} 

@Transactional 
@SuppressWarnings("unchecked") 
public T getById(PK id){ 
    T result = (T) getSession().load(type, id); 
    return result; 
} 

@Transactional 
@SuppressWarnings("unchecked") 
public List<T> list(){ 
    Criteria crit = getSession().createCriteria(type); 
    return (List<T>) crit.list(); 
} 
... 

Это работает прекрасно для "нормальных" объектов.

Я пытаюсь использовать интерфейс как тип T (например: IBattery):

public class BatteryDao extends GenericHibernateDao<IBattery, Integer> implements IBatteryDao { 

} 

-

public interface IBattery { 

    public int getId(); 

    public double getLevel(); 
    public void setLevel(double _level); 
} 

-

@Entity 
public class SimulationBattery implements IBattery { 

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(unique = true, nullable = false) 
private int id; 

@Column(unique = false, nullable = false) 
private double level; 

@Override 
public int getId() { 
    return id; 
} 

@Override 
public double getLevel() { 
    return level; 
} 

@Override 
public void setLevel(double _level) { 
    level = _level; 
} 

Я IBattery через создании экземпляра Spring ApplicationContext файл для загрузки реализации SimulationBattery. Он работает упорствовать, список (с критериями), но не в состоянии с «GetByID» причиной нагрузки, отправка:

org.hibernate.MappingException: Unknown entity: ***.***.****.IBattery 

Это правое дело только реализация (SimulationBattery) отображается в hibernate.cfg.xml, но я не Не понимаю, почему я могу добавить, перечислить, но не загружать ... У кого-то есть объяснение?

спасибо.

Fabien.

(я использую Hibernate, Spring и Java8)

ответ

1

Когда вы упорствовать объект, необходимо передать конкретный экземпляр сущности в спящий режим. Таким образом, Hibernate получает экземпляр SimulationBattery, например, и, таким образом, знает тип сущности, которую вы сохраняете: SimulationBattery.

Когда вы перечислите, вы полагаетесь на полиморфную функцию Hibernate: вы просите Hibernate вернуть все экземпляры сущности IBattery. Hibernate знает все конкретные классы сущностей, которые реализуют этот интерфейс (например, SimulationBattery и ProductionBattery). Поэтому он загружает их все из базы данных и возвращает их.

Но когда вы запрашиваете один конкретный объект по ID, все Hibernate знает, что объект является одним из объектов, реализующих IBattery, и что его идентификатор - тот, который вы передаете (например, 42). Этого недостаточно. Вы можете захотеть, чтобы SimulationBattery 42, или ProductionBattery 42, и Hibernate не знали. Отсюда и провал.

+0

Благодарим вас за разъяснение. Итак, наконец, я должен перезаписать инъекцию SpringMVC и вручную сделать это. Это так расстраивает ... – MilacH

Смежные вопросы