powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA - получить значение поля сгенерированное триггером при вставке строки
37 сообщений из 37, показаны все 2 страниц
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542098
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно как сконфигурировать(аннотировать) поле сущности, чтобы при сохранении (обновлении) объекта, это поле получало значение устанавливаемое триггером для данной операции на таблице?
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542101
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@GeneratedValue
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542177
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz@GeneratedValue
Пробовал:
Код: java
1.
2.
3.
	@Id
	@GeneratedValue
	private Long id;


но возвращается ошибка:
Код: plaintext
1.
ORA-02289: последовательность не существует
; SQL [n/a]
Непонятно, причем тут и какая последовательность.

Я так понимаю, что
@GeneratedValue = @GeneratedValue(strategy=GenerationType.AUTO)
а GenerationType.AUTO - Indicates that the persistence provider should pick an appropriate strategy for the particular database
не то что нужно.
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542212
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясните внятно. Ваше свойство это Id? Ошибка возникает потому что у JPA провайдера для Oracle считается что id генерится через Sequence.
У вас Id создаётся через триггер? То есть это не просто свойство, а именно id?
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542223
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ух-ты. Похоже @GeneratedValue работает ислючительно в паре с @Id. Очередное гениальной решение со стороны JPA. Действительно, зачем может ещё понадобиться GeneratedValue, кроме как для Id.
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542235
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Проверил, @GeneratedValue не работает для обычных полей, просто игнорирует занчение присвоенное триггером.
Я для @Id генерируется исключение указанное мной выше.
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542243
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если strategy=GenerationType.TABLE ?
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542245
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
publexusПроверил, @GeneratedValue не работает для обычных полей, просто игнорирует занчение присвоенное триггером.
Я для @Id генерируется исключение указанное мной выше.
Так а вам какой из двух нужен?
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542262
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczа если strategy=GenerationType.TABLE ?
Это не то (там, насколько я понял, создается специальная таблица, обслуживающая нумерацию)

BlazkowiczТак а вам какой из двух нужен?
Нужны оба
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542266
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не гуру низкоуровневой комуникации с БД. Но, по-моему всё упирается явно в JDBC Return Generated Keys.
Получить можно только сгенерированые ключи. Отсюда, вероятно, и привязка к Id. В остальных случаях, нужно сущность перечитать после вставки явно.
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542272
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для Id, похоже, придется привязываться к JPA провайдеру:
http://docs.jboss.org/hibernate/core/3.2/api/org/hibernate/id/SelectGenerator.html
Для других свойств остаётся только явно перечитать.
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542284
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и не перечитывать отдельным запросом. Специальный insert может вернуть все сгенерированые значения, а не только ключи.
Но как только этим воспользоваться из ЖПА - не понятно. Только ковырять провайдера.
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542355
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Возможно.

Что ж, как вариант - процедуру persist в DAO переписать как persist+refresh
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542362
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
publexusСобственно как сконфигурировать(аннотировать) поле сущности, чтобы при сохранении (обновлении) объекта, это поле получало значение устанавливаемое триггером для данной операции на таблице?

как у вас описана таблица та часть где ИД и сам триггер, можете расписат ьподробнее?
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542390
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJackкак у вас описана таблица та часть где ИД и сам триггер, можете расписат ьподробнее?

Могу, конечно, привести простейший пример, но сама конкретная реализация триггера и таблицы не имеет значения в данном вопросе.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table search_session (
		id						integer	not null,
		status_code				not null,
		constraint search_session_pk primary key(id)
);
/
create or replace trigger search_session_trg_bi
	before insert on search_session for each row
begin
	if :new.id is null then
		select id_seq.nextval into :new.id from dual;
	end if; 
	:new.status_code	:= 'NEW';
end;
/


Код: 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.
@Entity
@Table(name="SEARCH_SESSION")
@NamedQuery(name="SearchSession.findAll", query="SELECT s FROM SearchSession s")
public class SearchSession implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@Column(NAME="ID", updatable = false)
	private Long id;

	@Column(name="STATUS_CODE")
	private String statusCode;

	public SearchSession() {
	}

	public Long getId() {
		return this.id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getStatusCode() {
		return this.statusCode;
	}

	public void setStatusCode(String statusCode) {
		this.statusCode = statusCode;
	}

}
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542461
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
publexuseJackкак у вас описана таблица та часть где ИД и сам триггер, можете расписат ьподробнее?

Могу, конечно, привести простейший пример, но сама конкретная реализация триггера и таблицы не имеет значения в данном вопросе.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table search_session (
		id						integer	not null,
		status_code				not null,
		constraint search_session_pk primary key(id)
);
/
create or replace trigger search_session_trg_bi
	before insert on search_session for each row
begin
	if :new.id is null then
		select id_seq.nextval into :new.id from dual;
	end if; 
	:new.status_code	:= 'NEW';
end;
/


Код: 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.
@Entity
@Table(name="SEARCH_SESSION")
@NamedQuery(name="SearchSession.findAll", query="SELECT s FROM SearchSession s")
public class SearchSession implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@Column(NAME="ID", updatable = false)
	private Long id;

	@Column(name="STATUS_CODE")
	private String statusCode;

	public SearchSession() {
	}

	public Long getId() {
		return this.id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getStatusCode() {
		return this.statusCode;
	}

	public void setStatusCode(String statusCode) {
		this.statusCode = statusCode;
	}

}



Блин - я в оракле полный NULL :) - в какой момент сработает триггер?
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542497
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJackБлин - я в оракле полный NULL :) - в какой момент сработает триггер?
Написано же
before insert
не нужно быть экспертом в оракле.
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542518
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
publexus,

Я других вариантов не вижу.
Простой и не эффективный - перечитать после вставки.
Сложный, но эффективный - специальный INSERT запрос, чтобы вернул все сгенерированые значения и расковырять кишки JPA провайдера, чтобы эти значения обновить у сущности.
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542531
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Тогда правильно должно отработать на @GeneratedValue(strategy= IDENTITY)
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542536
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJackТогда правильно должно отработать на @GeneratedValue(strategy= IDENTITY)
Не факт, что отработает. Там есть заморочки с Oracle и его JDBC драйвером. Завасит от JPA провайдера.
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542553
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczeJackТогда правильно должно отработать на @GeneratedValue(strategy= IDENTITY)
Не факт, что отработает. Там есть заморочки с Oracle и его JDBC драйвером. Завасит от JPA провайдера.

Да не факт, но автору протестировать, думаю, большого труда не составит.
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542578
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJack,

Да попробовал я это уже все, еще до того как открыть тему.
Если указать @GeneratedValue(strategy=GenerationType.IDENTITY), то:
Код: sql
1.
2.
org.springframework.dao.DataIntegrityViolationException: ORA-01858: вместо ожидаемой цифры обнаружен нецифровой символ
; SQL [n/a]; nested exception is org.hibernate.exception.DataException: ORA-01858: вместо ожидаемой цифры обнаружен нецифровой символ
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542584
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
publexuseJack,

Да попробовал я это уже все, еще до того как открыть тему.
Если указать @GeneratedValue(strategy=GenerationType.IDENTITY), то:
Код: sql
1.
2.
org.springframework.dao.DataIntegrityViolationException: ORA-01858: вместо ожидаемой цифры обнаружен нецифровой символ
; SQL [n/a]; nested exception is org.hibernate.exception.DataException: ORA-01858: вместо ожидаемой цифры обнаружен нецифровой символ


Это уже интереснее. А SQL лог смотрели? Что за запрос едет? Может это триггер упал?
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542587
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
publexus,

и stacktrace покажите, пожалуйста.
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542602
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Извините, это уже только завтра.
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542647
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczpublexuseJack,

Да попробовал я это уже все, еще до того как открыть тему.
Если указать @GeneratedValue(strategy=GenerationType.IDENTITY), то:
Код: sql
1.
2.
org.springframework.dao.DataIntegrityViolationException: ORA-01858: вместо ожидаемой цифры обнаружен нецифровой символ
; SQL [n/a]; nested exception is org.hibernate.exception.DataException: ORA-01858: вместо ожидаемой цифры обнаружен нецифровой символ


Это уже интереснее. А SQL лог смотрели? Что за запрос едет? Может это триггер упал?

Так это уже другая ошибка.
Не может ли быть ошибки при преобразовании Long <=> integer?
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38542660
AlexJm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJackBlazkowiczпропущено...

Это уже интереснее. А SQL лог смотрели? Что за запрос едет? Может это триггер упал?

Так это уже другая ошибка.
Не может ли быть ошибки при преобразовании Long <=> integer?
А не может в Oracle пойти что-нибудь типа 1.2341E14 при генерации хэша?
Кстати, не очень понятно, как все эти волшебные аннотации должны помочь JPA выполнить insert...returning. Там случайно refresh-политик нет? (хотя, зачем я это спрашиваю)
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38543041
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexJmeJackпропущено...


Так это уже другая ошибка.
Не может ли быть ошибки при преобразовании Long <=> integer?
А не может в Oracle пойти что-нибудь типа 1.2341E14 при генерации хэша?
Кстати, не очень понятно, как все эти волшебные аннотации должны помочь JPA выполнить insert...returning. Там случайно refresh-политик нет? (хотя, зачем я это спрашиваю)

При такой стратегии в оракл вообще нечего пойти не должно - значение Id поля должно быть прочитано после вставки.
Дальше ждем лог от автора.
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38543108
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Могу предположить, что стратегия identity для Oracle возвращает поле ROWID, которое, как известно, в RADIX формате, там действительно полно букв.
Для полей, заполняемых триггером, учебник рекомендует использовать стратегию select, но для этого нужно какое-то ключевое поле:
Код: java
1.
2.
3.
4.
5.
6.
7.
@Id @GeneratedValue(generator="trigger-generated")
@GenericGenerator(
  name="trigger-generated",
  strategy = "sequence",
  parameters = @Parameter(name="key", value = "socialSecurityNumber")
)
public String getId() {


Поэтому если нет альтернативного ключа, то ничего не получится.
Считаю, что в данному случае разуменее всего использовать GenericGenerator со стратегией sequence, который делает ровно то же самое, что и приведенный код триггера, только на клиенте
Код: java
1.
2.
3.
4.
5.
6.
7.
@Id @GeneratedValue(generator="oracle-generated")
@GenericGenerator(
  name="oracle-generated",
  strategy = "sequence",
  parameters = @Parameter(name="sequence", value = "id_seq")
)
public Long getId() {
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38543114
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В первом примере ошибка, конечно же, select а не sequence
Код: java
1.
2.
3.
4.
5.
6.
7.
@Id @GeneratedValue(generator="trigger-generated")
@GenericGenerator(
  name="trigger-generated",
  strategy = "select",
  parameters = @Parameter(name="key", value = "socialSecurityNumber")
)
public String getId() {
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38543119
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,

Если бы дело касалось ключей, то я бы так и делал. Но часть логики перенесена на уровень хранимых процедур БД и генерироваться будут не только ключевые поля.
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38543138
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот отладочные данные:

стектрейсorg.springframework.dao.DataIntegrityViolationException: ORA-01858: вместо ожидаемой цифры обнаружен нецифровой символ
; SQL [n/a]; nested exception is org.hibernate.exception.DataException: ORA-01858: вместо ожидаемой цифры обнаружен нецифровой символ

at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:648)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:104)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:403)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:163)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeRepositoryPostProcessor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy34.save(Unknown Source)
at ru.gazprom.skz.lisa.searchengine.data.dao.SearchSessionDAO.save(SearchSessionDAO.java:38)
at ru.gazprom.skz.lisa.searchengine.data.dao.SearchSessionDAO$$FastClassByCGLIB$$6058ea3e.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:713)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:646)
at ru.gazprom.skz.lisa.searchengine.data.dao.SearchSessionDAO$$EnhancerByCGLIB$$6267dcd7.save(<generated>)
at ru.gazprom.skz.lisa.searchengine.data.SearchEngineDataTest.testSearchSessionAndSearchMethodEntities(SearchEngineDataTest.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.hibernate.exception.DataException: ORA-01858: вместо ожидаемой цифры обнаружен нецифровой символ

at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:71)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
at com.sun.proxy.$Proxy36.executeUpdate(Unknown Source)
at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:61)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2936)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3447)
at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:203)
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:183)
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:167)
at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:320)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:126)
at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:78)
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:208)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:151)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:843)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:818)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:822)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:865)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)
at com.sun.proxy.$Proxy29.persist(Unknown Source)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:358)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:358)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:343)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
... 39 more
Caused by: java.sql.SQLDataException: ORA-01858: вместо ожидаемой цифры обнаружен нецифровой символ

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1008)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3530)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1350)
at com.jolbox.bonecp.PreparedStatementHandle.executeUpdate(PreparedStatementHandle.java:203)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
... 78 more
трассировка бдTrace file /ORACLE_DEST/SRV/bdump/diag/rdbms/SRV/SRV/trace/SRV_ora_12165.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /home/ora/app/oracle/product/11.2.0.2
System name: Linux
Node name: ORCL.localnet
Release: 2.6.32-71.el6.x86_64
Version: #1 SMP Wed Sep 1 01:33:01 EDT 2010
Machine: x86_64
Instance name: SRV
Redo thread mounted by this instance: 1
Oracle process number: 41
Unix process pid: 12165, image: oracle@ORCL.localnet


*** 2014-01-30 09:34:50.193
*** SESSION ID:(203.30889) 2014-01-30 09:34:50.193
*** CLIENT ID:() 2014-01-30 09:34:50.193
*** SERVICE NAME:(SYS$USERS) 2014-01-30 09:34:50.193
*** MODULE NAME:(JDBC Thin Client) 2014-01-30 09:34:50.193
*** ACTION NAME:() 2014-01-30 09:34:50.193

CLOSE #140559093168072:c=0,e=8,dep=0,type=1,tim=1391060090176669
=====================
PARSING IN CURSOR #140559093141480 len=50 dep=0 uid=220 oct=47 lid=220 tim=1391060090193513 hv=1159991935 ad='e5fd3ab0' sqlid='atrnd612k84mz'
begin dbms_utility.get_tz_transitions(:1,:2); end;
END OF STMT
PARSE #140559093141480:c=0,e=71,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=0,tim=1391060090193511
BINDS #140559093141480:
Bind#0
oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1000000 frm=01 csi=171 siz=24 off=0
kxsbbbfp=7fd676d2eb28 bln=22 avl=03 flg=05
value=-1
Bind#1
oacdty=23 mxl=32767(32767) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1000000 frm=01 csi=171 siz=32767 off=0
kxsbbbfp=7fd676d26728 bln=32767 avl=00 flg=05
EXEC #140559093141480:c=0,e=336,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=0,tim=1391060090193910
ERROR #1:err=6502 tim=1391060090193928
WAIT #140559093141480: nam='SQL*Net break/reset to client' ela= 9 driver id=1952673792 break?=1 p3=0 obj#=-1 tim=1391060090193975
WAIT #140559093141480: nam='SQL*Net break/reset to client' ela= 7780 driver id=1952673792 break?=0 p3=0 obj#=-1 tim=1391060090201770
WAIT #140559093141480: nam='SQL*Net message to client' ela= 1 driver id=1952673792 #bytes=1 p3=0 obj#=-1 tim=1391060090201792
WAIT #140559093141480: nam='SQL*Net message from client' ela= 3319 driver id=1952673792 #bytes=1 p3=0 obj#=-1 tim=1391060090205142
CLOSE #140559093141480:c=0,e=12,dep=0,type=1,tim=1391060090205179
=====================
PARSING IN CURSOR #140559093267640 len=175 dep=0 uid=220 oct=2 lid=220 tim=1391060090205529 hv=3621841296 ad='f5f13348' sqlid='4ccqvz3by1uch'
insert into SEARCH_SESSION (SEARCH_FILTER_DATA, SEARCH_FILTER_NAME, START_TIME, STATUS_CODE, STATUS_MESSAGE, STATUS_TIME, USER_NAME) values (:1 , :2 , :3 , :4 , :5 , :6 , :7 )
END OF STMT
PARSE #140559093267640:c=0,e=313,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,plh=0,tim=1391060090205521
=====================
PARSING IN CURSOR #140559093214608 len=42 dep=1 uid=0 oct=3 lid=0 tim=1391060090206726 hv=844002283 ad='e82cbcd0' sqlid='ftj9uawt4wwzb'
select condition from cdef$ where rowid=:1
END OF STMT
PARSE #140559093214608:c=1000,e=616,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=0,tim=1391060090206725
BINDS #140559093214608:
Bind#0
oacdty=11 mxl=16(16) mxlc=00 mal=00 scl=00 pre=00
oacflg=18 fl2=0001 frm=00 csi=00 siz=16 off=0
kxsbbbfp=7fd676d22950 bln=16 avl=16 flg=05
value=00004A08.006B.0001
EXEC #140559093214608:c=1000,e=10879,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=1884964958,tim=1391060090217690
FETCH #140559093214608:c=0,e=57,p=0,cr=2,cu=0,mis=0,r=1,dep=1,og=4,plh=1884964958,tim=1391060090217777
STAT #140559093214608 id=1 cnt=1 pid=0 pos=1 obj=31 op='TABLE ACCESS BY USER ROWID CDEF$ (cr=1 pr=0 pw=0 time=45 us cost=1 size=15 card=1)'
CLOSE #140559093214608:c=0,e=2943,dep=1,type=0,tim=1391060090220747
BINDS #140559093267640:
Bind#0
oacdty=01 mxl=32(01) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1000010 frm=01 csi=171 siz=152 off=0
kxsbbbfp=7fd676d20568 bln=32 avl=00 flg=05
Bind#1
oacdty=12 mxl=07(49) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1000000 frm=01 csi=171 siz=0 off=32
kxsbbbfp=7fd676d20588 bln=07 avl=07 flg=01
value="1/30/2014 0:0:0"
Bind#2
oacdty=01 mxl=32(01) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1000010 frm=01 csi=171 siz=0 off=40
kxsbbbfp=7fd676d20590 bln=32 avl=00 flg=01
Bind#3
oacdty=01 mxl=32(01) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1000010 frm=01 csi=171 siz=0 off=72
kxsbbbfp=7fd676d205b0 bln=32 avl=00 flg=01
Bind#4
oacdty=180 mxl=11(11) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1000000 frm=01 csi=171 siz=0 off=104
kxsbbbfp=7fd676d205d0 bln=11 avl=00 flg=01
Bind#5
oacdty=01 mxl=32(08) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1000010 frm=01 csi=171 siz=0 off=120
kxsbbbfp=7fd676d205e0 bln=32 avl=08 flg=01
value="TestUser"
Bind#6
oacdty=112 mxl=4000(4000) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1000000 frm=01 csi=171 siz=4000 off=0
kxsbbbfp=7fd676d2aaf8 bln=4000 avl=00 flg=05
EXEC #140559093267640:c=3000,e=18905,p=0,cr=2,cu=0,mis=1,r=0,dep=0,og=1,plh=0,tim=1391060090224478
ERROR #1:err=1858 tim=1391060090224504
STAT #140559093267640 id=1 cnt=0 pid=0 pos=1 obj=0 op='LOAD TABLE CONVENTIONAL (cr=0 pr=0 pw=0 time=10 us)'
WAIT #140559093267640: nam='SQL*Net break/reset to client' ela= 1 driver id=1952673792 break?=1 p3=0 obj#=-1 tim=1391060090224581
WAIT #140559093267640: nam='SQL*Net break/reset to client' ela= 1776 driver id=1952673792 break?=0 p3=0 obj#=-1 tim=1391060090226371
WAIT #140559093267640: nam='SQL*Net message to client' ela= 1 driver id=1952673792 #bytes=1 p3=0 obj#=-1 tim=1391060090226390
WAIT #140559093267640: nam='SQL*Net message from client' ela= 57688 driver id=1952673792 #bytes=1 p3=0 obj#=-1 tim=1391060090284098
XCTEND rlbk=1, rd_only=1, tim=1391060090284148
WAIT #0: nam='SQL*Net message to client' ela= 1 driver id=1952673792 #bytes=1 p3=0 obj#=-1 tim=1391060090284184


По трассе видно, что он почему то пытается значение TestUser запихнуть в STATUS_TIME, и из-за этого возникает ошибка.

класс сущности
Код: 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.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
@Entity
@Table(name="SEARCH_SESSION")
@NamedQuery(name="SearchSession.findAll", query="SELECT s FROM SearchSession s")
public class SearchSession implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="ID",updatable = false)
	private Long id;

	@Lob
	@Column(name="SEARCH_FILTER_DATA")
	private String searchFilterData;

	@Column(name="SEARCH_FILTER_NAME")
	private String searchFilterName;

	@Temporal(TemporalType.DATE)
	@Column(name="START_TIME")
	private Date startTime;

	@Column(name="STATUS_CODE")
	private String statusCode;

	@Column(name="STATUS_MESSAGE")
	private String statusMessage;

	@Column(name="STATUS_TIME")
	private Timestamp statusTime;

	@Column(name="USER_NAME")
	private String userName;

	public SearchSession() {
	}

	public Long getId() {
		return this.id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getSearchFilterData() {
		return this.searchFilterData;
	}

	public void setSearchFilterData(String searchFilterData) {
		this.searchFilterData = searchFilterData;
	}

	public String getSearchFilterName() {
		return this.searchFilterName;
	}

	public void setSearchFilterName(String searchFilterName) {
		this.searchFilterName = searchFilterName;
	}

	public Date getStartTime() {
		return this.startTime;
	}

	public void setStartTime(Date startTime) {
		this.startTime = startTime;
	}

	public String getStatusCode() {
		return this.statusCode;
	}

	public void setStatusCode(String statusCode) {
		this.statusCode = statusCode;
	}

	public String getStatusMessage() {
		return this.statusMessage;
	}

	public void setStatusMessage(String statusMessage) {
		this.statusMessage = statusMessage;
	}

	public Timestamp getStatusTime() {
		return this.statusTime;
	}

	public void setStatusTime(Timestamp statusTime) {
		this.statusTime = statusTime;
	}

	public String getUserName() {
		return this.userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}


код используемый для тестирования
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
		GenericXmlApplicationContext appContext = new GenericXmlApplicationContext();
		appContext.load("classpath:app-context-data.xml");
		appContext.refresh();

		SearchSessionDAO searchSessionDAO = appContext.getBean("searchSessionDAO", SearchSessionDAO.class);

		SearchSession searchSession = new SearchSession();
		searchSession.setUserName("TestUser");
		searchSessionDAO.save(searchSession);

		appContext.close();


...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38543141
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Узнаю олдскульную технику )))
Если нет альтернативного ключа, то значение ключа придется все-таки получать при вставке (strategy = "sequence"), а остальные поля, которые заполняются триггером, просто пометить хибернейтовской аннотацией
Код: java
1.
@org.hibernate.annotations.Generated(GenerationTime.INSERT)
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38543173
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraУзнаю олдскульную технику )))
Если нет альтернативного ключа, то значение ключа придется все-таки получать при вставке (strategy = "sequence"), а остальные поля, которые заполняются триггером, просто пометить хибернейтовской аннотацией
Код: java
1.
@org.hibernate.annotations.Generated(GenerationTime.INSERT)



Спасибо. Такой метод работает.
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38543183
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,

Только еще вопрос: можно ли создать один глобальный SequenceGenerator и использовать его во всех таблицах, т.к. sequence один на всех?
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38543189
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
publexusiТолько еще вопрос: можно ли создать один глобальный SequenceGenerator и использовать его во всех таблицах, т.к. sequence один на всех?
Мне кажется, не получится, так как аннотация для генератора не будет видна из других классов.
Кстати, а может достаточно и ключ пометить хибернейтовской аннотацией
Код: java
1.
@org.hibernate.annotations.Generated(GenerationTime.INSERT)

и не ссылаться ни на какие генераторы, вдруг заработает?
...
Рейтинг: 0 / 0
JPA - получить значение поля сгенерированное триггером при вставке строки
    #38543275
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraКстати, а может достаточно и ключ пометить хибернейтовской аннотацией
Код: java
1.
@org.hibernate.annotations.Generated(GenerationTime.INSERT)

и не ссылаться ни на какие генераторы, вдруг заработает?

Нет, не катит, ошибка:
Код: xml
1.
ids for this class must be manually assigned before calling save()
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA - получить значение поля сгенерированное триггером при вставке строки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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