繁体   English   中英

Spring JPA 一对多-多对一关系

[英]One to many - many to one relationship in Spring JPA

我有这张优惠券 Class

package Kinn.College.CouponManagementSystem.entities;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table (name = "companies")
public class Company {
    @Id
    @GeneratedValue (strategy =  GenerationType.IDENTITY)
    @Column (name = "company_id")
    private int id; // id of the company
    @Column (name = "company_name")
    private String name; // name of the company
    @Column (name = "company_email")
    private String email; // email of the company
    @Column (name = "company_password")
    private String password; // password of the company

    @OneToMany(mappedBy = "company_id", cascade = CascadeType.ALL)
    private List<Coupon> coupons;


}

我有这家公司 class

package Kinn.College.CouponManagementSystem.entities;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table (name = "companies")
public class Company {
    @Id
    @GeneratedValue (strategy =  GenerationType.IDENTITY)
    @Column (name = "company_id")
    private int id; // id of the company
    @Column (name = "company_name")
    private String name; // name of the company
    @Column (name = "company_email")
    private String email; // email of the company
    @Column (name = "company_password")
    private String password; // password of the company

    @OneToMany(mappedBy = "company_id", cascade = CascadeType.ALL)
    private List<Coupon> coupons;


}

出于某种原因,当我尝试从数据库中获取带有优惠券列表的公司时,一对多 - 多对一关系会产生错误。

我正在使用此语法从 DB 获取一个 copmany。

{
Company company = companyService.getCompanyById(1);
        System.out.println("Got company by id: " + company);
}

如果我从每家公司中删除优惠券列表,它就可以正常工作。 这是错误信息;

2023-01-16T11:59:33.266+02:00 ERROR 16808 --- [           main] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: Collection 'Kinn.College.CouponManagementSystem.entities.Company.coupons' is 'mappedBy' a property named 'company_id' which does not exist in the target entity 'Kinn.College.CouponManagementSystem.entities.Coupon'


我试过询问多个非常了解 Spring 的人,他们都说它看起来不错,应该可以工作。

mapped_by引用属性或引用的 class,而不是列名:

@OneToMany(mappedBy = "id", cascade = CascadeType.ALL)
private List<Coupon> coupons;

顺便说一句:注意 java 命名约定。 Package 名称只能包含小写字符

我假设一家公司可以关联许多优惠券。

所以在优惠券class 中,你可以有一个 Company 成员代表它所属的公司:

@ManyToOne
@JoinColumn(name = "company_id")
private Company company;

在这里,company_id 将成为指向公司表主键的外键

公司class 中,您可以拥有它拥有的优惠券列表:

@OneToMany(mappedBy = "company", orphanRemoval = true)
private List<Coupon> coupons = new ArrayList<>();

Company实体应该有一个字段指向其所有优惠券,如下所示:

@OneToMany(mappedBy="company")
private Set<Coupon> coupons;

mappedBy字段是我们将在Coupon实体中使用的实例变量名称,用于指向关联的Company

Coupon实体应该有一个字段来指向它的所有优惠券,例如:

@ManyToOne
@JoinColumn(name="company_id", nullable=false)
private Company company;

名称字段是指Coupon表中指向Company表的外键的名称。

可以查看这篇文章https://www.baeldung.com/hibernate-one-to-many

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM