|
|
|
вопрос на собеседовании hibernate + spring
|
|||
|---|---|---|---|
|
#18+
Доброе время суток! Подскажите как ответить корректно на такой вот вопрос: 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(); } } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 18:42:30 |
|
||
|
вопрос на собеседовании hibernate + spring
|
|||
|---|---|---|---|
|
#18+
Чтобы не ломать глаза: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 18:47:15 |
|
||
|
вопрос на собеседовании hibernate + spring
|
|||
|---|---|---|---|
|
#18+
AbstractHibernateDAO и HibernateTemplate делают примерно то же самое. Spring чудесно сам связывает поток с транзакцией. Зачем делать это руками? Это просто мусорный код, который несет минимум логики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 18:59:27 |
|
||
|
вопрос на собеседовании hibernate + spring
|
|||
|---|---|---|---|
|
#18+
к тому же не всегда транзакция должна начинаться и оканчиваться на сохранении объекта. вдруг стоит задача либо сохранить 5 объектов одновременно, либо ни одного. тогда метод saveOrUpdate должен уметь работать в рамках транзакции которая стартовала где-то раньше и будет завершена позже коммитом или откатом. так что лучше Transactional переместить в service layer, или конфигурять транзакции через xml, а не прибивать их гвоздями-аннотациями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 19:37:51 |
|
||
|
вопрос на собеседовании hibernate + spring
|
|||
|---|---|---|---|
|
#18+
chpashaк тому же не всегда транзакция должна начинаться и оканчиваться на сохранении объекта. вдруг стоит задача либо сохранить 5 объектов одновременно, либо ни одного. тогда метод saveOrUpdate должен уметь работать в рамках транзакции которая стартовала где-то раньше и будет завершена позже коммитом или откатом. так что лучше Transactional переместить в service layer, или конфигурять транзакции через xml, а не прибивать их гвоздями-аннотациями. Не очень понял коментария. Propagation по-умолчанию - REQUIRED. Если DAO метод вызывать из другого транзакционного метода, то аннотация в DAO ни на что не повлияет. Метод будет выполнятся в текущей транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 20:33:36 |
|
||
|
вопрос на собеседовании hibernate + spring
|
|||
|---|---|---|---|
|
#18+
BlazkowiczPropagation по-умолчанию - REQUIRED a вот как, не знал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 22:13:34 |
|
||
|
вопрос на собеседовании hibernate + spring
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНе очень понял коментария. Propagation по-умолчанию - REQUIRED. Если DAO метод вызывать из другого транзакционного метода, то аннотация в DAO ни на что не повлияет. Метод будет выполнятся в текущей транзакции. но в любом случае лучше @Transactional в сервис layer, а то придется почти все методы DAO помечать транзакционными. Это я ТС говорю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 23:46:59 |
|
||
|
вопрос на собеседовании hibernate + spring
|
|||
|---|---|---|---|
|
#18+
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 другими способами! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2013, 01:52:29 |
|
||
|
вопрос на собеседовании hibernate + spring
|
|||
|---|---|---|---|
|
#18+
Скорее всего, под "другим" управлением транзакции имеется ввиду ручное управление. http://static.springsource.org/spring/docs/3.0.x/reference/transaction.html#transaction-programmatic ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2013, 06:57:32 |
|
||
|
вопрос на собеседовании hibernate + spring
|
|||
|---|---|---|---|
|
#18+
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/ тут еще есть на эту тему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2013, 07:15:33 |
|
||
|
вопрос на собеседовании hibernate + spring
|
|||
|---|---|---|---|
|
#18+
забыл никно в любом случае лучше @Transactional в сервис layer, а то придется почти все методы DAO помечать транзакционными. Это я ТС говорю. DAO методы обязательно нужно помечать транзакционными. Методы на чтение при этом желательно маркировать как readOnly. Всегда бывает необходимость что-то вызывать мимо сервиса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2013, 10:12:21 |
|
||
|
вопрос на собеседовании hibernate + spring
|
|||
|---|---|---|---|
|
#18+
bob8Из комментариев я понял, что еще одним способом организации Hibernate transactional – организовывать управления транзакциями через описание в XML, а не через аннотации @Transactional. Если я что-то не так понял! - Объясните, более доходчиво как организовать Hibernate transactional connections другими способами! Вопрос был про самый нижний метод, а не про аннотацию. Здесь же не понятно для чего этот метод был написао вообще. Потому как тоже самое решается настройками Spring. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2013, 10:13:42 |
|
||
|
вопрос на собеседовании hibernate + spring
|
|||
|---|---|---|---|
|
#18+
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 уже содержит логику связи потока, конекшна и транзакции. Зачем нужен свой метод, который это делает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2013, 10:16:03 |
|
||
|
вопрос на собеседовании hibernate + spring
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2013, 11:32:12 |
|
||
|
вопрос на собеседовании hibernate + spring
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2013, 11:32:22 |
|
||
|
|

start [/forum/topic.php?fid=59&tid=2129268]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
| others: | 271ms |
| total: | 403ms |

| 0 / 0 |
