Добрый день, пишу не большое приложения с использованием Hibernate + servlet, все работает и так как я на пути изучения Hibernate возник вопрос Правильно ли я обрабатываю Сессию и транзакции?
Немного о структуре кода
Есть класс HibernateUtil где билдится Сессионфактори.
Есть Абстрактый класс где объявлены CRUD операции от него наследуется класс DAOUser который реализовывает эти методы + есть интерфейс в котором есть методы (ну типо заточены для работы только с классом USER) и класс DAOUser их реализовывает.
B в классе DAOUser я реализовываю методы CRUD, так вот подскажите правильно ли я обрабатываю их и если есть ошибки по структуре или любые другие буду рад выслушать как лучше или правильнее сделать.Если есть по этому поводу статьи , это тоже приветсвуется!
Я читал что каждая операция должна обрабатываться только в отдельной сессии, поэтому сделал так, но тут же есть вопрос Не реализовал ли я таким образом анти-шаблон?
Класс DAOUser:
public class DaoUser extends AbstractDAO<UserE, Integer> implements DAOUserInterface{
private SessionUtil sessionUtil;
public DaoUser(){
}
@Override
public List<UserE> getAll() {
List<UserE> users = new ArrayList<>();
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
try {
Query query = session.createSQLQuery("SELECT * FROM test.users").addEntity(UserE.class);
users = query.list();
tx.commit();
}catch (HibernateException e){
tx.rollback();
e.printStackTrace();
System.out.println("Error in method getAll " + e.getMessage());
return users;
}finally {
System.out.println("Sesion close getAll - in class USER");
session.close();
}
return users;
}
@Override
public UserE update(UserE entity) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
try{
session.update(entity);
tx.commit();
}catch(HibernateException e){
tx.rollback();
e.printStackTrace();
System.out.println("Error in method update " + e.getMessage());
return null;
}finally {
System.out.println("Sesion close update - in class USER");
session.close();
}
return entity;
}
@Override
public UserE getEntityById(Integer id) {
UserE userE = new UserE();
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
try {
// tx = session.beginTransaction();
userE = session.load(UserE.class, id);
if (userE != null){
System.out.println("it is a getEntityById " + userE.toString());
}
tx.commit();
}catch (HibernateException e){
tx.rollback();
e.printStackTrace();
System.out.println("Error in method getEntityById " + e.getMessage());
}finally {
System.out.println("Sesion close getEntityById - in class USER");
session.close();
}
return userE;
}
@Override
public boolean delete(Integer id) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
try{
UserE user = session.load(UserE.class, id);
if(user != null){
session.delete(user);
}
tx.commit();
}catch(HibernateException e){
tx.rollback();
e.printStackTrace();
System.out.println("Error in method delete " + e.getMessage());
return false;
}finally {
System.out.println("Sesion close delete - in class USER");
session.close();
}
return true;
}
@Override
public boolean create(UserE entity) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
try {
session.save(entity);
// session.flush();
tx.commit();
}catch (HibernateException e){
tx.rollback();
e.printStackTrace();
System.out.println("Error in method create " + e.getMessage());
return false;
}finally {
System.out.println("Sesion close create - in class USER");
session.close();
}
return true;
}
@Override
public UserE findUserByNickName(String nickname) {
UserE userE = new UserE();
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
try {
userE = (UserE) session.createCriteria(UserE.class).add(Restrictions.eq("nickname", nickname)).uniqueResult();
if(userE != null) {
System.out.println(" IT IS FROM findUserByNickName = " +userE.toString());
}
tx.commit();
}catch (HibernateException e){
tx.rollback();
e.printStackTrace();
System.out.println("Error in method findUserByNickName " + e.getMessage());
}finally {
System.out.println("Sesion close findUserByNickName - in class USER");
session.close();
}
return userE;
}
@Override
public UserE findConfirmKey(String key) {
UserE userE = new UserE();
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
try {
userE = (UserE) session.createCriteria(UserE.class).add(Restrictions.eq("key", key)).uniqueResult();
if(userE != null) {
System.out.println(userE.toString());
}
tx.commit();
}catch (HibernateException e){
tx.rollback();
e.printStackTrace();
System.out.println("Error in method confirmKey " + e.getMessage());
}finally {
System.out.println("Sesion close findConfirmKey - in class USER");
session.close();
}
return userE;
}
}