Постоянство сущности не работает при использовании двунаправленной связи - @OneToMany и @ManyToOne - PullRequest
0 голосов
/ 30 октября 2019

Используется 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 - это не работает. Как у кого-нибудь есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...