【发布时间】:2021-09-16 10:25:23
【问题描述】:
我有很多课:
DAO 用户:
public interface UserDao {
User findById(int id);
void save(User user);
void update(User user);
void delete(User user);
List<User> findAll();
}
DaoImpl 用户:
public class UserDaoImpl implements UserDao {
@Override
public User findById(int id) {
...
return user;
}
@Override
public void save(User user) {
...
}
@Override
public void update(User user) {
...
}
@Override
public void delete(User user) {
...
}
@Override
public List<User> findAll() {
...
return users;
}
}
或
VpnDao
public interface VpnDao {
Vpn findById(byte id);
void save(Vpn vpn);
void update(Vpn vpn);
void delete(Vpn vpn);
List<Vpn> findAll();
}
VpnDaoImpl
public class VpnDaoImpl implements VpnDao {
@Override
public Vpn findById(byte id) {
...
return vpn;
}
@Override
public void save(Vpn vpn) {
...
}
@Override
public void update(Vpn vpn) {
...
}
@Override
public void delete(Vpn vpn) {
...
}
@Override
public List<Vpn> findAll() {
...
return vpnList;
}
}
还有大约 20 个具有相同 CRUD 方法的类似类。 我创建了 RepositoryDAO 类:
@Log4j2
public class RepositoryDAO {
public static void save(Object obj) {
Transaction transaction = null;
try (Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession()){
transaction = session.beginTransaction();
session.save(obj);
transaction.commit();
} catch (Exception x) {
log.error(x);
if (transaction != null) transaction.rollback();
}
}
public static void update(Object obj) {
Transaction transaction = null;
try (Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession()){
transaction = session.beginTransaction();
session.update(obj);
transaction.commit();
} catch (Exception x) {
log.error(x);
if (transaction != null) transaction.rollback();
}
}
public static void delete(Object obj) {
Transaction transaction = null;
try (Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession()){
transaction = session.beginTransaction();
session.delete(obj);
transaction.commit();
} catch (Exception x) {
log.error(x);
if (transaction != null) transaction.rollback();
}
}
}
并在其中实现了重复的方法。
我不喜欢这个解决方案:(
我无法将所有重复的方法都带入 RepositoryDAO 类
UserDaoImpl 类现在是:
public class UserDaoImpl implements UserDao {
@Override
public User findById(int id) {
Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
User user = session.get(User.class, id);
session.close();
return user;
}
@Override
public void save(User user) {
RepositoryDAO.save(user);
}
@Override
public void update(User user) {
RepositoryDAO.update(user);
}
@Override
public void delete(User user) {
RepositoryDAO.delete(user);
}
@Override
public List<User> findAll() {
Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
List<User> users = session.createQuery("From User", User.class).list();
session.close();
return users;
}
}
我知道 Spring 中有 JpaRepository 或 CrudRepository。 但是我们的项目没有使用 Spring。
请告诉我如何在没有 Spring(仅 Hibernate)的情况下执行类似于 JpaRepository 或 CrudRepository 的操作?
【问题讨论】:
标签: hibernate spring-data crud