powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по транзакции
22 сообщений из 22, страница 1 из 1
Вопрос по транзакции
    #37755667
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть две таблицы
http://img607.imageshack.us/img607/2106/bbnnn.png

если получаю два объекта с формы не изменённые либо частично измененные то сохранятся нормально.
Но если я изменю значение email (что является связывающим эти две таблицы) то получаю
авторorg.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; SQL [update ACCOUNT set login=?, password=? where id=?]; constraint [USER2.PATIENT_LOGIN_FK1]; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
Вот так я делаю обновление

1.
Код: java
1.
2.
				patient.setAccount(account);
				accountBo.register(patient, account);


2.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class AccountBoImpl implements AccountBo{
	@Autowired
	AccountDao accountDao;
	
	@Autowired
	PatientDao patientDao;	

	@Transactional
	public void register(Patient patient, Account account) throws HibernateException
	{
		accountDao.saveOrUpdate(account);
		patientDao.saveOrUpdate(patient);
	}	

}


3.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Repository
public class AccountDaoImpl implements AccountDao {
	@Autowired
	private SessionFactory sessionFactory;

	@Transactional
	public void saveOrUpdate(Account account) throws HibernateException{
		sessionFactory.getCurrentSession().saveOrUpdate(account);
	}

}


4.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Repository
public class PatientDaoImpl implements PatientDao {
	@Autowired
	private SessionFactory sessionFactory;	
	
	@Transactional
	public void saveOrUpdate(Patient patient) {
		sessionFactory.getCurrentSession().saveOrUpdate(patient);
	}

}
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37755770
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде как в моём случае транзакции будут "по принципу матрёшки".
Т.е.
@Transactional
register
|
v
@Transactional
saveOrUpdate(Account account), saveOrUpdate(Patient patient)

т.е. на одна тракзакция идёт на обе saveOrUpdate операции и две подчиняются первой.
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37755773
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятие иерархии тут есть?
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37755858
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно правильным проектпированием считается ставить аннотации @Transactional только на методах самого верхнего уровня(так называемые входные точки сценариев, или бизнес-транзакций)

Вообще сушествует то ли 6 то ли 7 типов атрибутов у аннотации @Transactional(лень искать точное количество), так вот на входных точках вешают @Transactional(Required) - при таком раскладе на каждый вызов бизнес-транзакции будет создаваться или если она уже создана, то будет переиспользоваться.
Все остальные методы, которые вызываются из главного либо вообще не должны иметь аннтоаций, либо должны иметь @Transactional(Support)

Есть конечно исключения, все зависит от логики - иногда для быстродействия могут убираться транзакции на чтение, или наоборот есть требование чтобы все вызовы обязательно были под транзакцией - тогда используют @Transactional(Mandatory)

В общем рекомендую цикл статей Майка Ричардса - очень многое проясняет - http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=transaction+strategies:
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37755895
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убрал у остальных

Повесил так
Код: java
1.
2.
3.
4.
5.
6.
	@Transactional(propagation=Propagation.REQUIRED)
	public void register(Patient patient, Account account) throws HibernateException
	{
		accountDao.saveOrUpdate(account);
		patientDao.saveOrUpdate(patient);
	}	


но получаю опять
авторorg.springframework.dao.DataIntegrityViolationException
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37755902
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так у меня описан transaction manager
Код: java
1.
2.
3.
4.
5.
6.
7.
	<tx:annotation-driven transaction-manager="txManager"
		order="200" />

	<bean id="txManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>


всё вроде нормально запускается.
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37755907
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoder,

А как замаплены классы Patient, Account?

Одно из требований которого я придерживаюсь при выборе ключа, это то что значение ключа никогда не меняется. По мне email очень неудачный вариант ключа, а почему не ссылаться по суррогатному ключу?
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37755915
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замапены аннотацией
@Entity
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37755920
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но ведь с простым sql это сделать возможно, а так как hibernate в конечном этоге делает sql то должно получится.
Скорей всего делается commit после
Код: java
1.
accountDao.saveOrUpdate(account);


и поэтому error
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37755922
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoder,

Связь между Patient и Account есть? И как она замаплена?
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37755924
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С account
Код: java
1.
2.
3.
	//bi-directional many-to-one association to Patient
	@OneToMany(mappedBy="account")
	private Set<Patient> patients;



С patient
Код: java
1.
2.
3.
4.
	//bi-directional many-to-one association to Account
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="EMAIL", referencedColumnName="LOGIN", nullable=false)
	private Account account;
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37755944
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По мне email очень неудачный вариант ключа, а почему не ссылаться по суррогатному ключу?
+1
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37755945
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ccoder,

За обоими концами этого отношения правильно следишь?
Код: java
1.
2.
patient.setAccount(account);
account.getPatients().add(patient);
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37755947
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но всёравно (это относится к плохо спроектированной базе данных) как сделать такую транзакцию
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37755957
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0ccoder,

За обоими концами этого отношения правильно следишь?
Код: java
1.
2.
patient.setAccount(account);
account.getPatients().add(patient);


Я сейчас только что проверил, а там в принципе мне нужно следить. Так как я отдаю их форму и из формы получаю только account.email другим.
Объекты с @SessionAttribute
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37755961
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас только
Код: java
1.
accountBo.register(patient, account);

есть, но по прежнему ошибка.
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37755964
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0ccoder,

За обоими концами этого отношения правильно следишь?
Код: java
1.
2.
patient.setAccount(account);
account.getPatients().add(patient);


А с этим кодом
авторorg.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: lt.webmedia.eHealth.domain.Account.patients, no
session or session was closed
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37756028
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вообще отслеживать транзакции? (использую oracle db)
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37756032
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и какие строки hibernate пытается выполнить
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37756081
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну транзакция вроде как сама работает (т.е. не сразу всё обновляется)
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37756122
ccoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123 По мне email очень неудачный вариант ключа, а почему не ссылаться по суррогатному ключу?
+1
Вы правы.
СПАСИБО
...
Рейтинг: 0 / 0
Вопрос по транзакции
    #37756134
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У подчиненной таблицы должно стоять on update cascade на внешнем ключе.
Как вообще отслеживать транзакции? (использую oracle db)
и какие строки hibernate пытается выполнить

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


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