Java 使用JpaRepository同时保存合成对象

Java 使用JpaRepository同时保存合成对象,java,mysql,jpa,spring-data-jpa,logic,Java,Mysql,Jpa,Spring Data Jpa,Logic,我可以直接在数据库中保存包含另一个对象的对象吗 我的后端结构如下所示: 休息服务 服务 存储库(扩展JpaRepository) 模型 假设我的模型中有两个实体:公司和地址。两者都是由IntelliJ提供的JPA工具生成的 公司级模型 @Entity public class Company { private int idcompany; private String name; private Address address; @Id @Column

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

我的后端结构如下所示:

  • 休息服务
  • 服务
  • 存储库(扩展
    JpaRepository
  • 模型
  • 假设我的模型中有两个实体:
    公司
    地址
    。两者都是由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;
        }
    }
    
    地址类模型

    @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
    。因此,我有
    CompanyRepository
    AddressRepository
    。我在各自的服务类中使用这两个接口:
    CompanyService
    AddressService
    。这就是我将业务逻辑放在这里的地方。全部正常

    现在,我收到了一个REST服务,通过POST一个对象
    公司
    ,它包含对象
    地址
    。我需要将它们保存到数据库(MySql)中

    在json文件中有
    公司
    ,其中包含
    地址

    到目前为止,我一直在执行以下步骤:

  • 保存
    地址
  • 检索刚刚保存的
    地址
    (我需要
    idaddress
  • 我使用
    setAddress
    地址与公司关联
    
  • 保存
    公司
  • 我试图保存通过REST从
    CompanyService
    (使用
    CompanyRepository
    )调用方法
    save
    接收到的对象
    Company
    ),但出现错误:

    Column 'idaddress' cannot be null
    

    我问你。使用
    JpaRepository

    是否有一种更简单的方法可以同时保存
    公司
    地址

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

    @ManyToOne
    @JoinColumn(name = "idaddress", referencedColumnName = "idaddress", nullable = false,
                cascade = CascadeType.PERSIST)
    public Address getAddress() {
        return address;
    }
    
    对于EntityManager上的每个方法,都定义了一个级联类型

    在此处阅读有关级联类型的更多信息:

    您从帖子中看到的json对象是什么样子的。我将RequestBody映射到我的对象。