Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / вопрос на собеседовании hibernate + spring / 15 сообщений из 15, страница 1 из 1
28.05.2013, 18:42:30
    #38277319
bob8
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос на собеседовании hibernate + spring
Доброе время суток! Подскажите как ответить корректно на такой вот вопрос:

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
28.05.2013, 18:47:15
    #38277329
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос на собеседовании hibernate + spring
Чтобы не ломать глаза:
Код: 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
28.05.2013, 18:59:27
    #38277351
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос на собеседовании hibernate + spring
AbstractHibernateDAO и HibernateTemplate делают примерно то же самое. Spring чудесно сам связывает поток с транзакцией. Зачем делать это руками? Это просто мусорный код, который несет минимум логики.
...
Рейтинг: 0 / 0
28.05.2013, 19:37:51
    #38277423
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос на собеседовании hibernate + spring
к тому же не всегда транзакция должна начинаться и оканчиваться на сохранении объекта. вдруг стоит задача либо сохранить 5 объектов одновременно, либо ни одного. тогда метод saveOrUpdate должен уметь работать в рамках транзакции которая стартовала где-то раньше и будет завершена позже коммитом или откатом.
так что лучше Transactional переместить в service layer, или конфигурять транзакции через xml, а не прибивать их гвоздями-аннотациями.
...
Рейтинг: 0 / 0
28.05.2013, 20:33:36
    #38277466
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос на собеседовании hibernate + spring
chpashaк тому же не всегда транзакция должна начинаться и оканчиваться на сохранении объекта. вдруг стоит задача либо сохранить 5 объектов одновременно, либо ни одного. тогда метод saveOrUpdate должен уметь работать в рамках транзакции которая стартовала где-то раньше и будет завершена позже коммитом или откатом.
так что лучше Transactional переместить в service layer, или конфигурять транзакции через xml, а не прибивать их гвоздями-аннотациями.
Не очень понял коментария. Propagation по-умолчанию - REQUIRED. Если DAO метод вызывать из другого транзакционного метода, то аннотация в DAO ни на что не повлияет. Метод будет выполнятся в текущей транзакции.
...
Рейтинг: 0 / 0
28.05.2013, 22:13:34
    #38277541
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос на собеседовании hibernate + spring
BlazkowiczPropagation по-умолчанию - REQUIRED
a вот как, не знал.
...
Рейтинг: 0 / 0
28.05.2013, 23:46:59
    #38277635
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос на собеседовании hibernate + spring
BlazkowiczНе очень понял коментария. Propagation по-умолчанию - REQUIRED. Если DAO метод вызывать из другого транзакционного метода, то аннотация в DAO ни на что не повлияет. Метод будет выполнятся в текущей транзакции.

но в любом случае лучше @Transactional в сервис layer, а то придется почти все методы DAO помечать транзакционными. Это я ТС говорю.
...
Рейтинг: 0 / 0
29.05.2013, 01:52:29
    #38277712
bob8
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос на собеседовании hibernate + spring
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
29.05.2013, 06:57:32
    #38277746
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос на собеседовании hibernate + spring
Скорее всего, под "другим" управлением транзакции имеется ввиду ручное управление.
http://static.springsource.org/spring/docs/3.0.x/reference/transaction.html#transaction-programmatic
...
Рейтинг: 0 / 0
29.05.2013, 07:15:33
    #38277753
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос на собеседовании hibernate + spring
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
29.05.2013, 10:12:21
    #38277897
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос на собеседовании hibernate + spring
забыл никно в любом случае лучше @Transactional в сервис layer, а то придется почти все методы DAO помечать транзакционными. Это я ТС говорю.
DAO методы обязательно нужно помечать транзакционными. Методы на чтение при этом желательно маркировать как readOnly. Всегда бывает необходимость что-то вызывать мимо сервиса.
...
Рейтинг: 0 / 0
29.05.2013, 10:13:42
    #38277899
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос на собеседовании hibernate + spring
bob8Из комментариев я понял, что еще одним способом организации Hibernate transactional – организовывать управления транзакциями через описание в XML, а не через аннотации @Transactional.
Если я что-то не так понял! - Объясните, более доходчиво как организовать Hibernate transactional connections другими способами!
Вопрос был про самый нижний метод, а не про аннотацию. Здесь же не понятно для чего этот метод был написао вообще. Потому как тоже самое решается настройками Spring.
...
Рейтинг: 0 / 0
29.05.2013, 10:16:03
    #38277902
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос на собеседовании hibernate + spring
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
29.05.2013, 11:32:12
    #38278131
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос на собеседовании hibernate + spring
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
29.05.2013, 11:32:22
    #38278133
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос на собеседовании hibernate + spring
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
Форумы / Java [игнор отключен] [закрыт для гостей] / вопрос на собеседовании hibernate + spring / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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