我有很多類:
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) { ...
public void update(User user) {
...
}
@Override
public void delete(User user) {
...
}
@Override
public List<User> findAll() {
...
return users;
}
}
OR
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) { ...
public void update(Vpn vpn) {
...
}
@Override public void update(Vpn vpn) { ...
public void delete(Vpn vpn) {
...
}
@Override public void delete(Vpn vpn) { ...
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 {
public User findById(int id) {
Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession() 。
User user = session.get(User.class, id) 。
session.close()。
return用戶。
}
public void save(User user) {
RepositoryDAO.save(user)。
}
public void update(User user) {
RepositoryDAO.update(user)。
}
public void delete(User user){
RepositoryDAO.delete(user)。
}
public List<User> findAll(){
Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession() 。
List<User> users = session. createQuery("From User", User.class)。list() 。
session.close()。
return用戶。
}
我知道在Spring中有一個JpaRepository或CrudRepository。 但是我們的專案并沒有使用Spring。
請告訴我如何在沒有Spring的情況下做類似于JpaRepository或CrudRepository的事情(只有Hibernate)?
uj5u.com熱心網友回復:
謝謝你 areus.
我添加了RepositoryCRUD類:
public abstract class RepositoryCRUD {
static <T> T findById(Class< T> type, Object id) {
Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession() 。
T = session.get(type, (Serializable) id)。)
session.close()。
return t。
}
public static <T> List< T> findAll(Class<T> type) {
Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession() 。
List<T> authorizationHistoryList = session.createQuery("From" type。 getName(), type).list()。
session.close()。
return authorizationHistoryList;
}
public static void save(span class="hljs-built_in">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; } title function_">update(span class="hljs-built_in">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; } title function_">delete(span class="hljs-built_in">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()。
}
}
}
而我的類VpnDaoImpl現在:
public class VpnDaoImpl implements VpnDao {
@Override
public Vpn findById(byte id) {
return RepositoryCRUD.findById(Vpn.class, id) 。
}
@Override。
public void save(Vpn vpn) {
RepositoryCRUD.save(vpn)。
}
@Override
public void update(Vpn vpn) {
RepositoryCRUD.update(vpn)。
}
@Override
public void delete(Vpn vpn) {
RepositoryCRUD.delete(vpn)。
}
@Override
public List<Vpn> findAll() {
return RepositoryCRUD.findAll(Vpn.class) 。
}
uj5u.com熱心網友回復:
你可以用默認行為實作道的模式,在你的自定義道中擴展默認行為。
有一個GenericDao.java
import java.io.Serializable。
public interface GenericDao< T extends Serializable, Id extends Serializable> {
T findById(Id id)。
T save(T entity)。
在GenericDaoImpl里面有一個默認的實作
package org.elephant.dao。
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
public abstract class GenericDaoImpl< T extends Serializable, Id extendsSerializable> implements GenericDao<T, Id> {
private final SessionFactory sessionFactory。
private final Class<T> persistentClass;
public GenericDaoImpl(SessionFactory sessionFactory) {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0] 。
this.sessionFactory = sessionFactory;
}
public T findById(Id id) {
Session session = sessionFactory.getCurrentSession();
return session.find(persistentClass, id);
}
public T save(T entity) {
Session session = sessionFactory.getCurrentSession();
Serializable savedEntity = session.save(entity);
return persistentClass.cast(savedEntity)。
}
具體的實作可以是這樣的。VpnDao將擁有從GenericDaoImpl繼承的默認方法。如果需要任何定制,請在VanDao.java中覆寫/實作它
。import org.hibernate.SessionFactory。
public class VpnDao implements GenericDaoImpl< Vpn, Long>{
public VpnDao(SessionFactory sessionFactory) {
super(sessionFactory)。
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/327142.html
標籤:
