私が取り組んでいる現在のアプリケーションは大きなものです。データベースは 300 以上のテーブルで構成されており、その数は増え続けています。現時点ではデスクトップ アプリケーションですが、Web に移行しています。
これに使用しているテクノロジーは、Spring (MVC) + バックエンドの Hibernate とフロントの ZK フレームワークです。データベースに 300 以上のテーブルがあり、その数の POJO も作成することになりました。Spring の DAO パターンを使用すると、プロジェクトには 300 以上の DAO オブジェクトと 300 以上のサービス クラスが必要になります。
これは私が現時点でやっている方法です:
ポジョ:
@Entity
@Table(name="test")
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Integer version;
private String m_name;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="jpa_id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Version
@Column(name="jpa_version", insertable=false, updatable=false)
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
@Column(name="name", length=30)
public String getM_name() {
return m_name;
}
public void setM_name(String m_name) {
this.m_name = m_name;
}
}
DAO オブジェクトのインターフェース:
public interface IDao<T> {
public List<T> getAll();
}
コピー/貼り付けを避けるために、すべての DAO オブジェクトによって拡張される汎用 DAO クラスを作成しました。
@Repository
public class GenericDAO<T extends Serializable> implements IDao<T> {
@Autowired
protected SessionFactory sessionFactory;
protected Class<T> entity;
@SuppressWarnings("unchecked")
public List<T> getAll() {
List<T> result = (List<T>) getSessionFactory().getCurrentSession().createQuery("from " + entity.getName()).list();
return result;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void setEntity(Class<T> entity) {
this.entity = entity;
}
}
DAO オブジェクト:
@Repository
public class TestDAO extends GenericDAO<Test> {
public TestDAO() {
setEntity(Test.class);
}
}
サービス インターフェイス:
public interface IService<T> {
public List<T> getAll();
}
サービスの実装:
@Service
public class TestService implements IService<Test> {
@Autowired
private IDao<Test> testDAO;
@Transactional(readOnly=true)
public List<Test> getAll() {
return testDAO.getAll();
}
public void setTestDAO(IDao<Test> testDAO) {
this.testDAO = testDAO;
}
}
2 つの質問があります。
c/p を回避するために、上記の GenericDAO クラスのような汎用サービスを作成するにはどうすればよいですか?
DAO の実装を見ると、コンストラクターしかありません。すべてのPOJOを処理する「1つの」DAOクラスと、すべて/1つのDAOオブジェクトを処理する1つのサービスクラスを持つ方法はありますか?