Hibernate & MariaDB auto_increment неправильно устанавливает FK с помощью каскада - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь сделать вставку родительского объекта (BulkSmsDataset) и его потомков (BulkSmsRecipient) одновременно.Я использую Hibernate 5 и MariaDB 10.1.Я должен быть в состоянии создать BulkSmsDataset и заполнить List<BulkSmsRecipientEntity> bulkSmsRecipientEntityList новыми объектами, а затем сохранить все сразу, не так ли?Но когда я пытаюсь это сделать, Hibernate неправильно устанавливает FK dataset_id для BulkSmsDatasetEntity объектов.

Я получаю следующее исключение:

Hibernate: insert into bulk_sms_dataset (job_id, name, template) values (?, ?, ?)
Hibernate: insert into bulk_sms_recipient (dataset_id, error_description, processed_on, processing_id, target) values (?, ?, ?, ?, ?)

..... 

ERRORS:

SQL Error: 1048, SQLState: 23000

(conn=330108) Column 'dataset_id' cannot be null

Caused by: java.sql.SQLException: Column 'dataset_id' cannot be null
Query is: insert into bulk_sms_recipient (dataset_id, error_description, processed_on, processing_id, target) values (?, ?, ?, ?, ?), parameters [<null>,<null>,<null>,<null>,'+41788718818']

Любая идея, почемуБывает?Почему неправильно устанавливается dataset_id?Идентификатор должен сначала вставить команду bulk_sms_dataset, а затем использовать идентификатор, сгенерированный auto_increment (MariaDB), чтобы установить FK для bulk_sms_recipient ...

Я поместил код для сущностей ниже.

@Entity
@Table(name = "bulk_sms_dataset")
@Data
@EqualsAndHashCode(exclude = "job")
public class BulkSmsDatasetEntity {

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

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

    @Column(name = "template")
    private String template;

    @JoinColumn(name = "job_id")
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private BulkSmsJobEntity job;

    @OneToMany(mappedBy = "bulkSmsDatasetEntity", fetch = FetchType.LAZY)
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    private List<BulkSmsRecipientEntity> bulkSmsRecipientEntityList;

}
@Entity
@Table(name = "bulk_sms_recipient")
@Data
@EqualsAndHashCode(exclude = "bulkSmsDatasetEntity")
public class BulkSmsRecipientEntity {

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

    @Column(name = "target")
    private String to;

    @Column(name = "error_description")
    private String error;

    @Column(name = "processing_id")
    private String processingId;

    @Column(name = "processed_on", columnDefinition = "timestamp")
    @Type(type = "org.hibernate.type.ZonedDateTimeType")
    private ZonedDateTime processedOn;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "dataset_id", nullable = false)
    private BulkSmsDatasetEntity bulkSmsDatasetEntity;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "recipient_id")
    private List<BulkSmsPlaceholderEntity> bulkSmsPlaceholderList;

}

1 Ответ

0 голосов
/ 07 мая 2019

Мне удалось решить проблему.

Я должен был добавить @JoinColumn(name = "dataset_id") к private List<BulkSmsRecipientEntity> bulkSmsRecipientEntityList;.

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