powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / вопрос на собеседовании hibernate + spring
15 сообщений из 15, страница 1 из 1
вопрос на собеседовании hibernate + spring
    #38277319
bob8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток! Подскажите как ответить корректно на такой вот вопрос:

Note the transactional method at the bottom of the code. Is there another way to use Hibernate + transactional connections? Is it better that what we have here? Why or why not?

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;

public abstract class AbstractDomainDao<T extends DomainObject> {

private SessionFactory sessionFactory;

abstract Class<T> domainClass();

public String getDomainClassName() {
return domainClass().getName();
}
@SuppressWarnings("unchecked")
public T findById(Integer id) {
getSessionFactory().getStatistics().logSummary();
String query = "from " + getDomainClassName() + " do where do.id = :id";
org.hibernate.Query q = getCurrentSession().createQuery(query);
q.setInteger("id", id);
return (T) q.uniqueResult();
}

@Transactional
public T saveOrUpdate(T domainObject, Connection con) {
getSessionFactory().getStatistics().logSummary();
getSessionForTransaction(con).saveOrUpdate(domainObject);
return domainObject;
}

@Transactional
public T saveOrUpdate(T domainObject) {
getSessionFactory().getStatistics().logSummary();
getCurrentSession().saveOrUpdate(domainObject);
return domainObject;
}

public Long count() {
return (Long) getCurrentSession().createQuery("select count(*) from " + domainClass().getName()).uniqueResult();
}

/**
* @return the sessionFactory
*/
public SessionFactory getSessionFactory() {
return sessionFactory;
}

/**
* @param sessionFactory
* the sessionFactory to set
*/
public void setSessionFactory(SessionFactory sessionFactory) {

this.sessionFactory = sessionFactory;
}

/**
* @return Session Object
*/
protected Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}

protected Session getSessionForTransaction(Connection con) {
if (con != null) {
System.out.println("Im using my own connection");
return sessionFactory.openSession(con);
} else {
return sessionFactory.getCurrentSession();
}

}

}
...
Рейтинг: 0 / 0
вопрос на собеседовании hibernate + spring
    #38277329
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы не ломать глаза:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;

public abstract class AbstractDomainDao<T extends DomainObject> {
	
	        private SessionFactory sessionFactory;
	
	        abstract Class<T> domainClass();
	
	        public String getDomainClassName() {
	                return domainClass().getName();
	        }
		        @SuppressWarnings("unchecked")
	        public T findById(Integer id) {
	                getSessionFactory().getStatistics().logSummary();
	                String query = "from " + getDomainClassName() + " do  where do.id = :id";
	                org.hibernate.Query q = getCurrentSession().createQuery(query);
	                q.setInteger("id", id);
	                return (T) q.uniqueResult();
	        }
	
	        @Transactional
	        public T saveOrUpdate(T domainObject, Connection con) {
	                getSessionFactory().getStatistics().logSummary();
	                getSessionForTransaction(con).saveOrUpdate(domainObject);
	                return domainObject;
	        }
	       
	        @Transactional
	        public T saveOrUpdate(T domainObject) {
	                getSessionFactory().getStatistics().logSummary();
	                getCurrentSession().saveOrUpdate(domainObject);
	                return domainObject;
	        }
	
	        public Long count() {
	                return (Long) getCurrentSession().createQuery("select count(*) from " + domainClass().getName()).uniqueResult();
	        }
	
	        /**
	         * @return the sessionFactory
	         */
	        public SessionFactory getSessionFactory() {
	                return sessionFactory;
	        }
	
	        /**
	         * @param sessionFactory
	         *            the sessionFactory to set
	         */
	        public void setSessionFactory(SessionFactory sessionFactory) {
	
	                this.sessionFactory = sessionFactory;
	        }
	
	        /**
	         * @return Session Object
 	         */
	        protected Session getCurrentSession() {
	                return sessionFactory.getCurrentSession();
	        }
	       
	        protected Session getSessionForTransaction(Connection con) {
	                if (con != null) {
	                        System.out.println("Im using my own connection");
	                        return sessionFactory.openSession(con);
	                } else {
	                        return sessionFactory.getCurrentSession();
	                }
	               
	        }
	
	}
...
Рейтинг: 0 / 0
вопрос на собеседовании hibernate + spring
    #38277351
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AbstractHibernateDAO и HibernateTemplate делают примерно то же самое. Spring чудесно сам связывает поток с транзакцией. Зачем делать это руками? Это просто мусорный код, который несет минимум логики.
...
Рейтинг: 0 / 0
вопрос на собеседовании hibernate + spring
    #38277423
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к тому же не всегда транзакция должна начинаться и оканчиваться на сохранении объекта. вдруг стоит задача либо сохранить 5 объектов одновременно, либо ни одного. тогда метод saveOrUpdate должен уметь работать в рамках транзакции которая стартовала где-то раньше и будет завершена позже коммитом или откатом.
так что лучше Transactional переместить в service layer, или конфигурять транзакции через xml, а не прибивать их гвоздями-аннотациями.
...
Рейтинг: 0 / 0
вопрос на собеседовании hibernate + spring
    #38277466
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaк тому же не всегда транзакция должна начинаться и оканчиваться на сохранении объекта. вдруг стоит задача либо сохранить 5 объектов одновременно, либо ни одного. тогда метод saveOrUpdate должен уметь работать в рамках транзакции которая стартовала где-то раньше и будет завершена позже коммитом или откатом.
так что лучше Transactional переместить в service layer, или конфигурять транзакции через xml, а не прибивать их гвоздями-аннотациями.
Не очень понял коментария. Propagation по-умолчанию - REQUIRED. Если DAO метод вызывать из другого транзакционного метода, то аннотация в DAO ни на что не повлияет. Метод будет выполнятся в текущей транзакции.
...
Рейтинг: 0 / 0
вопрос на собеседовании hibernate + spring
    #38277541
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczPropagation по-умолчанию - REQUIRED
a вот как, не знал.
...
Рейтинг: 0 / 0
вопрос на собеседовании hibernate + spring
    #38277635
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНе очень понял коментария. Propagation по-умолчанию - REQUIRED. Если DAO метод вызывать из другого транзакционного метода, то аннотация в DAO ни на что не повлияет. Метод будет выполнятся в текущей транзакции.

но в любом случае лучше @Transactional в сервис layer, а то придется почти все методы DAO помечать транзакционными. Это я ТС говорю.
...
Рейтинг: 0 / 0
вопрос на собеседовании hibernate + spring
    #38277712
bob8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bob8Note the transactional method at the bottom of the code. Is there another way to use Hibernate + transactional connections? Is it better that what we have here? Why or why not?

translate:
Обратите внимание на способ транзакций в нижней части кода. Есть ли другой способ использовать Hibernate transactional connections? Что лучше?...

Из комментариев я понял, что еще одним способом организации Hibernate transactional – организовывать управления транзакциями через описание в XML, а не через аннотации @Transactional.
Если я что-то не так понял! - Объясните, более доходчиво как организовать Hibernate transactional connections другими способами!
...
Рейтинг: 0 / 0
вопрос на собеседовании hibernate + spring
    #38277746
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего, под "другим" управлением транзакции имеется ввиду ручное управление.
http://static.springsource.org/spring/docs/3.0.x/reference/transaction.html#transaction-programmatic
...
Рейтинг: 0 / 0
вопрос на собеседовании hibernate + spring
    #38277753
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAbstractHibernateDAO и HibernateTemplate делают примерно то же самое. Spring чудесно сам связывает поток с транзакцией. Зачем делать это руками? Это просто мусорный код, который несет минимум логики.
AbstractHibernateDAO убрали из поддержки Hibernate 4.
http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/orm/hibernate4/package-summary.html
авторpackage org.springframework.orm.hibernate4 Description

Package providing integration of Hibernate 4.x with Spring concepts.

Contains an implementation of Spring's transaction SPI for local Hibernate transactions. This package is intentionally rather minimal, with no template classes or the like, in order to follow Hibernate recommendations as closely as possible. We recommend using Hibernate's native sessionFactory.getCurrentSession() style .


http://blog.springsource.org/2007/06/26/so-should-you-still-use-springs-hibernatetemplate-andor-jpatemplate/ тут еще есть на эту тему.
...
Рейтинг: 0 / 0
вопрос на собеседовании hibernate + spring
    #38277897
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никно в любом случае лучше @Transactional в сервис layer, а то придется почти все методы DAO помечать транзакционными. Это я ТС говорю.
DAO методы обязательно нужно помечать транзакционными. Методы на чтение при этом желательно маркировать как readOnly. Всегда бывает необходимость что-то вызывать мимо сервиса.
...
Рейтинг: 0 / 0
вопрос на собеседовании hibernate + spring
    #38277899
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bob8Из комментариев я понял, что еще одним способом организации Hibernate transactional – организовывать управления транзакциями через описание в XML, а не через аннотации @Transactional.
Если я что-то не так понял! - Объясните, более доходчиво как организовать Hibernate transactional connections другими способами!
Вопрос был про самый нижний метод, а не про аннотацию. Здесь же не понятно для чего этот метод был написао вообще. Потому как тоже самое решается настройками Spring.
...
Рейтинг: 0 / 0
вопрос на собеседовании hibernate + spring
    #38277902
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidvAbstractHibernateDAO убрали из поддержки Hibernate 4.
http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/orm/hibernate4/package-summary.html

Про DAO не знал. То что template уже не нужен, это круто. А вот что и AbstractDAO теперь не нужен это вообще замечательно вдвойне.

Leonidv We recommend using Hibernate's native sessionFactory.getCurrentSession() style .

Вот и я о том же! Spring уже содержит логику связи потока, конекшна и транзакции. Зачем нужен свой метод, который это делает?
...
Рейтинг: 0 / 0
вопрос на собеседовании hibernate + spring
    #38278131
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЗдесь же не понятно для чего этот метод был написао вообще. Потому как тоже самое решается настройками Spring.
+1
скажу больше. Тот метод не нужен и БЕЗ спринг. Т.к. коннект проверять не нужно и весь тот класс теряет смысл.
А давать рецепт на ненужные вещи очень странно.
Вот это класс уменьшает код при ручном управлении транзакциями.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
package dao;

import main.Main;// пакет с DAO

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class HibernateUtil {
	private static SessionFactory factory;

	public static Configuration getInitializedConfiguration() {
		AnnotationConfiguration config = new AnnotationConfiguration();
		/* !!!!!!!!!!!!!!   // пакет с DAO */
		config.addAnnotatedClass(Book.class);
		config.addAnnotatedClass(Autor.class);
		config.configure();
		return config;
	}

	public static Session getSession() {
		if (factory == null) {
			Configuration config = HibernateUtil.getInitializedConfiguration();
			factory = config.buildSessionFactory();
		}
		Session hibernateSession = factory.getCurrentSession();
		return hibernateSession;
	}

	public static void closeSession() {
		HibernateUtil.getSession().close();
	}

	public static void recreateDatabase() {
		Configuration config;
		config = HibernateUtil.getInitializedConfiguration();
		new SchemaExport(config).create(true, true);
	}

	public static Session beginTransaction() {
		Session hibernateSession;
		hibernateSession = HibernateUtil.getSession();
		hibernateSession.beginTransaction();
		return hibernateSession;
	}

	public static void commitTransaction() {
		HibernateUtil.getSession().getTransaction().commit();
	}

	public static void rollbackTransaction() {
		HibernateUtil.getSession().getTransaction().rollback();
	}

	public static void main(String args[]) {
		HibernateUtil.recreateDatabase();
	}

}

...
Рейтинг: 0 / 0
вопрос на собеседовании hibernate + spring
    #38278133
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЗдесь же не понятно для чего этот метод был написао вообще. Потому как тоже самое решается настройками Spring.
+1
скажу больше. Тот метод не нужен и БЕЗ спринг. Т.к. коннект проверять не нужно и весь тот класс теряет смысл.
А давать рецепт на ненужные вещи очень странно.
Вот это класс уменьшает код при ручном управлении транзакциями.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
package dao;

import main.Main;// пакет с DAO

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class HibernateUtil {
	private static SessionFactory factory;

	public static Configuration getInitializedConfiguration() {
		AnnotationConfiguration config = new AnnotationConfiguration();
		/* !!!!!!!!!!!!!!   // пакет с DAO */
		config.addAnnotatedClass(Book.class);
		config.addAnnotatedClass(Autor.class);
		config.configure();
		return config;
	}

	public static Session getSession() {
		if (factory == null) {
			Configuration config = HibernateUtil.getInitializedConfiguration();
			factory = config.buildSessionFactory();
		}
		Session hibernateSession = factory.getCurrentSession();
		return hibernateSession;
	}

	public static void closeSession() {
		HibernateUtil.getSession().close();
	}

	public static void recreateDatabase() {
		Configuration config;
		config = HibernateUtil.getInitializedConfiguration();
		new SchemaExport(config).create(true, true);
	}

	public static Session beginTransaction() {
		Session hibernateSession;
		hibernateSession = HibernateUtil.getSession();
		hibernateSession.beginTransaction();
		return hibernateSession;
	}

	public static void commitTransaction() {
		HibernateUtil.getSession().getTransaction().commit();
	}

	public static void rollbackTransaction() {
		HibernateUtil.getSession().getTransaction().rollback();
	}

	public static void main(String args[]) {
		HibernateUtil.recreateDatabase();
	}

}

...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / вопрос на собеседовании hibernate + spring
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]