【问题标题】:Hibernate & MariaDB auto_increment is not setting FK properly with cascadeHibernate & MariaDB auto_increment 没有通过级联正确设置 FK
【发布时间】:2019-09-24 06:01:06
【问题描述】:

我正在尝试一次插入父对象 (BulkSmsDataset) 及其子对象 (BulkSmsRecipient)。我使用 Hibernate 5 和 MariaDB 10.1。我应该能够创建一个 BulkSmsDataset 并用新对象填充List<BulkSmsRecipientEntity> bulkSmsRecipientEntityList 然后一次持久化整个事情对吗?但是当我尝试这样做时,Hibernate 没有在 BulkSmsDatasetEntity 对象上正确设置 FK dataset_id

我得到以下异常:

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? id应该先插入bulk_sms_dataset,然后用auto_increment(MariaDB)生成的ID来设置bulk_sms_recipient的FK...

我把实体的代码放在下面。

@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;

}

【问题讨论】:

  • 您可以尝试将 GenerationType 更改为 AUTO 而不是 IDENTITY 吗?我记得我一直在 MySQL 中使用那个类型,我只在 SQL Server 上使用了 IDENTITY
  • @vc73 我试过了,现在 Hibernate 似乎正在尝试使用 TABLE 生成模式。我得到了这个例外:Table 'myschema.hibernate_sequence' doesn't exist
  • 您可能必须在您的休眠配置文件中设置&lt;prop key="hibernate.id.new_generator_mappings"&gt;false&lt;/prop&gt;(来源:stackoverflow.com/questions/32968527/…
  • 如果您使用 JPA,请改为设置 spring.jpa.properties.hibernate.id.new_generator_mappings=false
  • OK,设置后,现在 AUTO 给出与 IDENTITY 相同的异常:Caused by: java.sql.SQLException: Column 'dataset_id' cannot be null

标签: java mysql hibernate jpa mariadb


【解决方案1】:

我能够解决这个问题。

我必须将@JoinColumn(name = "dataset_id") 添加到private List&lt;BulkSmsRecipientEntity&gt; bulkSmsRecipientEntityList;

【讨论】:

    猜你喜欢
    • 2012-03-27
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2019-06-20
    相关资源
    最近更新 更多