【问题标题】:Save at the same time an composed object using JpaRepository使用 JpaRepository 同时保存组合对象
【发布时间】:2020-02-27 14:36:58
【问题描述】:

我可以将包含另一个对象的对象直接保存在数据库中吗?

我的后端结构是这样的:

  1. 休息服务
  2. 服务
  3. 存储库(扩展 JpaRepository
  4. 型号

假设我的模型中有两个实体:CompanyAddress。均由 IntelliJ 提供的 JPA 工具生成。

公司类模型

@Entity
public class Company {
    private int idcompany;
    private String name;
    private Address address;

    @Id
    @Column(name = "idcompany")
    public int getIdcompany() {
        return idcompany;
    }

    public void setIdcompany(int idcompany) {
        this.idcompany = idcompany;
    }

    @Basic
    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @ManyToOne
    @JoinColumn(name = "idaddress", referencedColumnName = "idaddress", nullable = false)
    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

地址类模型

@Entity
public class Address {
    private long idaddress;
    private String zip;

    @Id
    @Column(name = "idaddress")
    public long getIdaddress() {
        return idaddress;
    }

    public void setIdaddress(long idaddress) {
        this.idaddress = idaddress;
    }

    @Basic
    @Column(name = "zip")
    public String getZip() {
        return zip;
    }

    public void setZip(String zip) {
        this.zip = zip;
    }
}

此外,两个实体都有一个扩展接口JpaRepository<T,ID> 的接口。所以,我有CompanyRepositoryAddressRepository。我在它们各自的 Service 类中使用这两个接口:CompanyServiceAddressService。这是我放置业务逻辑的地方。一切好的

现在,我使用 REST 服务通过 POST 接收对象 Company,其中包含对象 Address。我需要将它们保存到数据库(MySql)中。

在json文件中有Company,其中包含Address

直到现在,我一直都在做这些步骤:

  1. 保存Address;
  2. 检索刚刚保存的Address(我需要idaddress);
  3. 我使用setAddressAddress 与公司关联;
  4. 保存Company

我试图保存通过 REST 接收到的对象 Company,从 CompanyService 调用方法 save(使用 CompanyRepository)但我收到了错误:

Column 'idaddress' cannot be null

我问你。有没有更简单的方法可以同时保存CompanyAddress 使用JpaRepository???

【问题讨论】:

  • 你得到的json对象是什么样子的?
  • 来自 POST。我将 RequestBody 映射到我的对象。

标签: java mysql jpa spring-data-jpa logic


【解决方案1】:

您没有定义任何级联。

您可以定义 PERSIST 以在公司被持久化时让地址持久化:

@ManyToOne
@JoinColumn(name = "idaddress", referencedColumnName = "idaddress", nullable = false,
            cascade = CascadeType.PERSIST)
public Address getAddress() {
    return address;
}

对于 EntityManager 上的每个方法,都定义了一个 CascadeType。

在此处阅读有关级联类型的更多信息: https://vladmihalcea.com/a-beginners-guide-to-jpa-and-hibernate-cascade-types/

【讨论】:

    猜你喜欢
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2014-12-11
    • 1970-01-01
    相关资源
    最近更新 更多