我在我的简单JavaFX项目中使用DAO模式和Hibernate来执行CRUD操作。由于我是Hibernate的新手,我想问你如何实现一个特定的方法。
首先,我有一个坚实的DAO界面:
import java.util.List;
import org.hibernate.Session;
import java.util.List;
import org.hibernate.Session;
public interface Dao<T, ID> {
public T findById(ID id);
public List<T> findAll();
public T save(T entity);
public void delete(T entity);
public void flush();
public void clear();
public void setSession(Session session);
}
然后我有另一个界面(更具体):
public interface FotoDao extends Dao<Foto, Integer> {
public List<Foto> findByCarId(Integer id);
}
接着是另一个班级:
import dao.interfaces.Dao;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import utils.HibernateUtil;
public class AbstractDao<T, ID extends Serializable> implements Dao<T, ID> {
private Class<T> persistentClass;
private Session session;
@SuppressWarnings("unchecked")
public AbstractDao() {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
public void setSession(Session session) {
this.session = session;
}
protected Session getSession() {
if (this.session == null) {
this.session = HibernateUtil.getSessionFactory().getCurrentSession();
}
return this.session;
}
public Class<T> getPersistentClass() {
return persistentClass;
}
@SuppressWarnings("unchecked")
@Override
public T findById(ID id) {
return (T) getSession().load(this.getPersistentClass(), id);
}
@Override
public List<T> findAll() {
return this.findByCriteria();
}
protected List<T> findByCriteria(Criterion... criterion) {
Criteria crit = this.getSession().createCriteria(this.getPersistentClass());
for (Criterion c : criterion) {
crit.add(c);
}
return (List<T>) crit.list();
}
@Override
public T save(T entity) {
this.getSession().saveOrUpdate(entity);
return entity;
}
@Override
public void delete(T entity) {
this.getSession().delete(entity);
}
@Override
public void flush() {
this.getSession().flush();
}
@Override
public void clear() {
this.getSession().clear();
}
}
最后我有一个具体的课程:
public class FotoHibernateDao extends AbstractDao<Foto, Integer> implements FotoDao {
@Override
public List<Foto> findByCarId(Integer id) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
如何实施findByCarId(Integer id)
方法?
在我的数据模型中,我有一个存储车辆照片的表格。我想要这个
仅返回与carId
(外键)关联的图像的方法。