使用 Hibernate 和 Repository Pattern 的多个类似 CRUD 方法?
Multiple similar CRUD methods with Hibernate and Repository Pattern?
使用存储库设计模式(我目前所了解的),您可以为每个业务模型创建一个存储库。所有这些存储库都实现了一个 IRepository 接口:
public interface IRepository<T> {
boolean add(T item);
boolean update(T item);
boolean remove(T item);
List<T> query(Specification specification);
}
使用 Hibernate,我以这种方式保存新记录:
try{
tx = session.beginTransaction();
session.save(mappedObject);
tx.commit();
}
catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}
finally {
session.close();
}
不会每个存储库基本上都有重复的 add 方法吗?使用已经定义的添加方法等创建存储库 class 不是更好吗?
我建议您创建一个 AbstractRepository
实现来实现共享的常用方法的 IRepository
接口,然后从抽象 class 扩展您的业务存储库实现。
public abstract class AbstractRepository<T> implements IRepository<T> {
@Override
public T add(T object) {
Session session = openSession();
try {
session.getTransaction().begin();
session.save( object );
session.getTransaction().commit();
return object;
}
catch ( Exception e ) {
if ( session.getTransaction().getStatus() == TransactionStatus.ACTIVE ) {
session.getTransaction().rollback();
}
throw e;
}
finally {
session.close();
}
}
}
使用存储库设计模式(我目前所了解的),您可以为每个业务模型创建一个存储库。所有这些存储库都实现了一个 IRepository 接口:
public interface IRepository<T> {
boolean add(T item);
boolean update(T item);
boolean remove(T item);
List<T> query(Specification specification);
}
使用 Hibernate,我以这种方式保存新记录:
try{
tx = session.beginTransaction();
session.save(mappedObject);
tx.commit();
}
catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}
finally {
session.close();
}
不会每个存储库基本上都有重复的 add 方法吗?使用已经定义的添加方法等创建存储库 class 不是更好吗?
我建议您创建一个 AbstractRepository
实现来实现共享的常用方法的 IRepository
接口,然后从抽象 class 扩展您的业务存储库实现。
public abstract class AbstractRepository<T> implements IRepository<T> {
@Override
public T add(T object) {
Session session = openSession();
try {
session.getTransaction().begin();
session.save( object );
session.getTransaction().commit();
return object;
}
catch ( Exception e ) {
if ( session.getTransaction().getStatus() == TransactionStatus.ACTIVE ) {
session.getTransaction().rollback();
}
throw e;
}
finally {
session.close();
}
}
}