Используется Oracle
Есть 2 таблицы:
таблица СООБЩЕНИЕ содержит запись о xml-конверт. Таблица имеет первичный ключ - "ID_VX"
таблица MESSAGE_XML содержит запись сообщений из xml-конверта. Каждая запись этой таблицы связана с записью из таблицы MESSAGE по полю "ID_VX" . Поле для таблицы имеет тип - Внешний ключ
здесь есть первичный ключ "ID_VX_XML"
org.springframework.orm.jpa. JpaSystemException: идентификаторы для этого класса должны быть назначены вручную перед вызовом save ():
Родительский объект-сущность описывает конверт, содержащий некоторые xml-сообщения.
class Parent{
@Entity
@Table(name = "MESSAGE")
public class Message {
@Id
@Column(name = "ID_VX", nullable = false, updatable = false)
private Long idVx;
...
@OneToMany(
mappedBy = "ncVxMessageSh",
cascade = CascadeType.ALL,
orphanRemoval = true,
fetch = FetchType.LAZY)
private Set<MessageXml> messageXmlSet = new HashSet<>();
}
....
Дочерний класс
class Child{
@Entity
@Table(name = "MESSAGE_XML")
public class MessageXml {
@Id
@Column(name = "ID_VX_XML", nullable = false)
private Long idVxXml;
...
@ManyToOne
@JoinColumn(name = "ID_VX", insertable = false, updatable = false)
private Message Message;
}
Сохранение выполняется с помощью Spring Data Jpa. @Transactinal установлен на уровень метода обслуживания.
Когда запись сохраняется в таблице, запускается триггер. Триггер запускает Последовательность и генерирует идентификатор.
Таким образом, когда в спящем режиме пытаются поместить запись, запускается триггер, который запускает Последовательность и генерируется идентификатор.
Но запись нене ставится.
Я полагаю, что Hiberanate создал запись для таблицы MESSAGE в своем собственном контексте постоянства, должен создать записи для таблицы MESSAGE_XML , вв то же время создается так, что записи суммы по мере необходимости, а именно, записи суммы, которые поле messageXmlSet имеет текущее время внутри себя.
РЕДАКТИРОВАТЬ
Я использовал генератор последовательности.
@Id
@SequenceGenerator( name = "jpaSequence.genNcVxMessageSh", sequenceName = "GEN_MESSAGE_ID", allocationSize = 1)
@GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "jpaSequence.genNcVxMessageSh")
@Column(name = "ID_VX", updatable = false, nullable = false)
private Long idVx;
...
и в дочерней таблице также
@Id
@SequenceGenerator( name = "jpaSequence.ncVxMessageShXml", sequenceName = "GEN_MESSAGE_XML_ID", allocationSize = 1)
@GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "jpaSequence.ncVxMessageShXml")
@Column(name = "ID_VX_XML", updatable = false, nullable = false)
private Long idVxXml;
...
@ManyToOne
@JoinColumn(name = "ID_VX", nullable = false)
private NcVxMessageSh ncVxMessageSh;
Я получил ошибку:
2019-10-31 08: 45: 11.818 WARN 14708 --- [main] ohengine.jdbc.spi.SqlExceptionHelper: Ошибка SQL: 2291, SQLState: 23000 2019-10-31 08: 45: 11.818 ОШИБКА 14708 --- [main] ohengine. jdbc.spi.SqlExceptionHelper: ORA-02291: альт ограничения целостностиТед (MARS.FK_NC_VXMESSAGE_SH) - исходный ключ не найден. 2019-10-31 08: 45: 11.822 ОШИБКА 14708 --- [main] ohiExceptionMapperStandardImpl: HHH000346: ошибка во время управляемого сбросаоператор execute]
Hibernate запросил 2 ID (два запроса) для 1 записи дочерних объектов. Я уменьшил количество дочерних записей до одной
2019-10-31 10:33:19.325 DEBUG 2920 --- [ main] org.hibernate.SQL :
select
gen_nc_vxmessage_sh_id.nextval
from
dual
Hibernate:
select
gen_nc_vxmessage_sh_id.nextval
from
dual
2019-10-31 10:33:19.587 DEBUG 2920 --- [ main] org.hibernate.SQL :
select
gen_nc_vxmessage_sh_xml_id.nextval
from
dual
Hibernate:
select
gen_nc_vxmessage_sh_xml_id.nextval
from
dual
2019-10-31 10:33:19.741 DEBUG 2920 --- [ main] org.hibernate.SQL :
insert
into
nc_vxmessage_sh
(code_proc, date_obr, date_vx_pack, kol_zap_pr, kol_zap_vx, name_pack, status_vx, version, id_vx)
values
(?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate:
insert
into
nc_vxmessage_sh
(code_proc, date_obr, date_vx_pack, kol_zap_pr, kol_zap_vx, name_pack, status_vx, version, id_vx)
values
(?, ?, ?, ?, ?, ?, ?, ?, ?)
2019-10-31 10:33:19.750 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [PuzDNwaFkWpsJZZ]
2019-10-31 10:33:19.752 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [TIMESTAMP] - [2019-04-05T21:57:40.000000099]
2019-10-31 10:33:19.753 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [TIMESTAMP] - [2019-03-01T20:57:59.000000099]
2019-10-31 10:33:19.756 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as [INTEGER] - [56468]
2019-10-31 10:33:19.756 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [5] as [INTEGER] - [115852]
2019-10-31 10:33:19.757 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [6] as [VARCHAR] - [RgFkVYfGUJXZBJHmCHvBErOvmGckdwMopWKL]
2019-10-31 10:33:19.758 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [7] as [VARCHAR] - [Whb]
2019-10-31 10:33:19.759 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [8] as [TIMESTAMP] - [2017-02-23T22:48:22.000000099]
2019-10-31 10:33:19.761 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [9] as [BIGINT] - [50]
2019-10-31 10:33:19.774 DEBUG 2920 --- [ main] org.hibernate.SQL :
insert
into
nc_vxmessage_sh_xml
(conversationid, date_rcv, messageid, msgcode, msg_updated, id_vx, origrelatesto, proc, procedureid, rcvcode, relatesto, sndcode, sndcountry, status_wr, text_osh, trn, id_vx_xml, msg_xml)
values
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate:
insert
into
nc_vxmessage_sh_xml
(conversationid, date_rcv, messageid, msgcode, msg_updated, id_vx, origrelatesto, proc, procedureid, rcvcode, relatesto, sndcode, sndcountry, status_wr, text_osh, trn, id_vx_xml, msg_xml)
values
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2019-10-31 10:33:19.775 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [IqFhINmFYbZPilFVkWsERMaWWAVbcicTEsJF]
2019-10-31 10:33:19.775 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [TIMESTAMP] - [2019-12-05T09:16:16.000000099]
2019-10-31 10:33:19.776 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [VARCHAR] - [qkpYRPrTwzGIDMCCieqOQYMSHzvFsGacPTgH]
2019-10-31 10:33:19.777 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as [VARCHAR] - [weyaTIgesTvIcnoIhWQe]
2019-10-31 10:33:19.778 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [5] as [TIMESTAMP] - [2018-02-17T19:20:51.000000099]
2019-10-31 10:33:19.779 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [6] as [BIGINT] - [35675]
2019-10-31 10:33:19.779 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [7] as [VARCHAR] - [mzYfZgIAItEKvWOAwOKInmOrpNPxRpVphMKb]
2019-10-31 10:33:19.780 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [8] as [VARCHAR] - [OlcMfthZskkvfElMIqJh]
2019-10-31 10:33:19.781 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [9] as [VARCHAR] - [hqlYcBiQRTUqakitRyWhmSjxLjifhobWFqzU]
2019-10-31 10:33:19.782 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [10] as [VARCHAR] - [sAqqDzvIbikycdJaSyKK]
2019-10-31 10:33:19.782 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [11] as [VARCHAR] - [DdJWWCrEmxCtTnRAYycwMNXeJMyQXnJlmqjk]
2019-10-31 10:33:19.783 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [12] as [VARCHAR] - [rJDWUIaKxfLMPngZnIhA]
2019-10-31 10:33:19.784 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [13] as [VARCHAR] - [xAD]
2019-10-31 10:33:19.784 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [14] as [VARCHAR] - [kcr]
2019-10-31 10:33:19.785 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [15] as [VARCHAR] - [OeEDIUBxoZLlklDrMrXNDArDZSFNpmFSQqAxbAlW]
2019-10-31 10:33:19.786 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [16] as [VARCHAR] - [bVpRIHOcnqYPvlVEisZp]
2019-10-31 10:33:19.787 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [17] as [BIGINT] - [63]
2019-10-31 10:33:19.788 TRACE 2920 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [18] as [CLOB] - [lNlLdjJdpxtoEmTXtviHgGOJXobEJLTjANcTwnzh]
2019-10-31 10:33:19.802 WARN 2920 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 2291, SQLState: 23000
2019-10-31 10:33:19.803 ERROR 2920 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : ORA-02291: integrity constraint violated (MARS.FK_NC_VXMESSAGE_SH) - the original key is not found
2019-10-31 10:33:19.807 ERROR 2920 --- [ main] o.h.i.ExceptionMapperStandardImpl : HHH000346: Error during managed flush [org.hibernate.exception.ConstraintViolationException: could not execute statement]
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [MARS.FK_NC_VXMESSAGE_SH]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
При попытке сделать это для записи дочернего элемента и произошла ошибка.
.FK_NC_VXMESSAGE_SH) - исходный ключне найден
Это ключ, который необходимо получить из установленной записи в родительской таблице
Как указать настройку использования триггера для целого числа?
@GeneratedValue( strategy = GenerationType.AUTO )
@GenericGenerator(
name="NC_ISXMESSAGE_SH_BIO",
strategy="org.hibernate.id.SelectGenerator"
)
Это не работает
@GeneratedValue( strategy = GenerationType.IDENTITY )
@org.hibernate.annotations.GenericGenerator(name="triggerGen", strategy = "trigger",
parameters = {@org.hibernate.annotations.Parameter(name="triggerGen", value="NC_ISXMESSAGE_SH_BIO")})
как правильно указать настройку?
Мы полностью создали генерацию идентификаторов со стратегией последовательности, но это не такработать также.
Когда я делаю родительский класс и дочерний объект как отдельные сущности для сопоставления и просто в одном и том же методе в рамках одной и той же транзакции выполняю сохранение записей, тогда по отдельности все работают. Таким образом, мы можем сказать, что генераторы последовательности для каждой таблицы работают четко.
Но когда мы используем ассоциацию @oneToMane и @ManytoOne - это не работает. Как у кого-нибудь есть идеи?