Cascade保存子实体失败了JPA(Spring数据+ Hibernate)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cascade保存子实体失败了JPA(Spring数据+ Hibernate)?相关的知识,希望对你有一定的参考价值。

我有一个非常简单的用例,我有2个实体:客户端和电子邮件(客户端有OneToMany电子邮件)。

当我尝试单独保存电子邮件时,它没有错误,我可以在数据库中看到它:

  @Test
  public void insertEmail() {

    Client fetchedClient = clientRepository.findClientsFullByPdlClient("25492040401007");

    Email email = new Email();
    email.setClient(fetchedClient);
    email.setEmail("toto@gmail.com");

    emailRepository.save(email);
  }

但是,当我尝试使用cascade保存新客户端及其电子邮件的主要用例时,我收到错误消息:

测试用例:

  @Test
  public void testCreateClient() {

    Client client = new Client();
    client.setPdlClient(PDL_CLIENT_TO_CREATE);    

    Email email1 = new Email();
    email1.setEmail("toto@gmail.com");
    email1.setOrdre((short) 1);
    client.addEmail(email1);

    Email email2 = new Email();
    email2.setEmail("toto@sfr.com");
    email2.setOrdre((short) 2);
    client.addEmail(email2);

    clientRepository.save(client);

  }

错误 :

WARN  o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 1048, SQLState: 23000
ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Column 'EMAIL' cannot be null

客户端的相关部分(由Dali + EclipseLink工具生成):

//bi-directional many-to-one association to Email
@OneToMany(cascade = CascadeType.ALL, mappedBy="client")
private List<Email> emails = new ArrayList<Email>();

public Email addEmail(Email email) {
    getEmails().add(email);
    email.setClient(this);

    return email;
}

Email.java(没有getter / setters):

@Entity
@Table(name="EMAIL")
public class Email {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="ID_EMAIL")
    private Integer idEmail;

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

    //bi-directional many-to-one association to Client
    @ManyToOne
    @JoinColumn(name="ID_CLIENT")
    private Client client;
}

现在,如果我在上面显示的成功单个电子邮件插入后立即尝试我的级联保存,我会收到一个不同的错误,显示我的“email”属性已设置且可读!

ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Duplicate entry 'toto@gmail.com' for key 'AK_EMAIL'

所以我有点困惑。我究竟做错了什么 ?如果它抱怨缺少ID_CLIENT,我会理解,但这个“'EMAIL'不能为空”,它是什么意思?

答案

好吧,我的不好,上面的所有代码实际上都在工作。

我有一个错字:

Email email2 = new Email();
email.setEmail("toto@sfr.com");
email.setOrdre((short) 2);
client.addEmail(email2);

代替 :

Email email2 = new Email();
email2.setEmail("toto@sfr.com");
email2.setOrdre((short) 2);
client.addEmail(email2);

我可以删除这个问题,但也许这对其他人来说可能是一个有用的工作示例。

以上是关于Cascade保存子实体失败了JPA(Spring数据+ Hibernate)?的主要内容,如果未能解决你的问题,请参考以下文章

springcloud JPA 懒加载失败

Spring Java JPA 将 String 保存为 tinyblob,导致 json 解析错误

Spring Jpa实体实例化失败:org.springframework.orm.jpa.JpaSystemException: No default constructor for entity

如何解决无法添加或更新子行:Spring JPA 中的外键约束失败错误?

在 Spring JPA 中删除实体

Spring Data JPA Repository:如何有条件地获取子实体