我正在尝试按照代码重用最佳做法。 我有一些通用的DAO接口和一些常用的方法:
public interface DaoInterface<T> {
T findById(int id);
//...more methods...
}
及其实现类:
public class GenericDao<T> implements DaoInterface<T> {
@SuppressWarnings("unchecked")
private final Class<T> persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
@Autowired
protected SessionFactory sessionFactory;
@Override
@SuppressWarnings("unchecked")
public T findById(int id) {
Session session = sessionFactory.getCurrentSession();
return (T) session.get(persistentClass, id);
}
//...more methods...
}
然后我的每个具体实现类扩展GenericDao
并实现其接口。
我的应用程序中也有Service层。一些服务的方法完全将他们的工作委托给DAO类。因此,在每个具体的Service实现中,我自动装配适当的DAO类并调用其方法。 所以现在它看起来:
public interface CustomerService {
Customer findById(int id);
}
和实施:
@Service
@Transactional(readOnly = true, rollbackFor = Exception.class)
public class CustomerServiceImpl implements CustomerService {
@Autowired
private CustomerDao customerDao;
@Override
public Customer findById(int id) {
return customerDao.findById(id);
}
}
我的问题是 - 如何以与DAO相同的方式生成服务类?所以我的具体课将会看起来:
public class CustomerServiceImpl extends GenericService<Customer> implements CustomerService {
.....
}
问题是我无法在通用服务中自动装配DAO类:
@Autowired
private GenericDao<T> dao;
这样我就可以调用dao
的方法。
我应该在构造函数中做到吗?
还有一个问题 - 在通用类或每个实现类中,使用@Transactional
注释方法的正确位置在哪里?
答案 0 :(得分:2)
您必须创建一个通用Dao的实例,并在服务层中做出一些决定:
abstract class GenericService<T> {
@Autowired
protected GenericDao dao;
@SuppressWarnings("unchecked")
protected final Class<T> persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
@Override
public T findById(int id) {
return dao.findById(id,persistenceClass);
}
}
此外,如果您需要一个好的通用存储库层,请查看Spring Data Jpa
这将使只有一个 GenericDao的实例。
接下来你有两个选择:
为每个实体创建一个类服务
Partial Class Pages_user
Inherits System.Web.UI.Page
Sub Page_Load(ByVal Sender As System.Object, ByVal e As System.EventArgs)
If Not IsPostBack Then
Dim conn As New System.Data.SqlClient.SqlConnection("Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\Laura\Final_proj\App_Data\surgerydb.mdf;Integrated Security=True;Connect Timeout=30")
Dim cmdstring As String = "SELECT pt.PatientId, pt.ForeName, pt.Username, md.Name, md.Purpose, md.Instrcutions " +
"FROM Patient pt INNER JOIN prescription pr ON pt.PatientId = pr.PatientId " +
"INNER JOIN medicine md ON md.MedicineId = pr.MedicineId Where pt.PatientId = @PatientId"
Dim dt As New System.Data.DataTable()
Dim da As New System.Data.SqlClient.SqlDataAdapter(cmdstring, conn)
da.SelectCommand.Parameters.Add("@PatientId", System.Data.SqlDbType.Int).Value = CInt(Session("PatientId").ToString())
conn.Open()
da.Fill(dt)
conn.Close()
GridView1.DataSource = dt
GridView1.DataBind()
End If
End Sub
End Class
现在,您的每个服务都必须使用提供的持久性类型扩展GenericService,并且作业已完成。