【问题标题】:Mapping Entity Relationships with Inheritance in Spring Boot在 Spring Boot 中使用继承映射实体关系
【发布时间】:2022-12-11 19:35:17
【问题描述】:

我正在定义一个类 User,它是我的其他两个类的父类:提交者和受让人。用户列出了我的所有属性,提交者和受让人将仅继承其所有属性。一个提交者可以提交很多请求。

我编码的模型如下所示:

用户

package com.merck.trackertest.models;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;

import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Data
@NoArgsConstructor
@Table(name = "users")
@Inheritance(strategy = InheritanceType.JOINED)
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String firstName;
    private String lastName;
    private String isid;
    private String email;

    public User(String firstName, String lastName, String isid, String email) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.isid = isid;
        this.email = email;
    }
}

提交者

package com.merck.trackertest.models;

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

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

@Entity
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Submitter extends User {


    @OneToMany(
        cascade = CascadeType.ALL,
        orphanRemoval = true
    )
    @JoinColumn(
        name = "submitter_id",
        referencedColumnName = "id"
    )
    private List<Request> requests = new ArrayList<>();

    public Submitter(String firstName, String lastName, String isid, String email) {
        super(firstName, lastName, isid, email);
    }

    public void addToList(Request request) {
        requests.add(request);
    }

    public void deleteFromList(Request request) {
        requests.remove(request);
    }    
}

要求

package com.merck.trackertest.models;



import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Data
@NoArgsConstructor
@Table(name = "requests")
public class Request {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String receivedDate;
    private String startDate;
    private String endDate;
    private String requestNumber;
    
    @ManyToOne
    @JoinColumn(name = "submitter_id", referencedColumnName = "id")
    private Submitter submitter;

    private String assigneeId;
    
    private String status;

    public Request(String receivedDate, String startDate, String requestNumber, String status) {
        this.receivedDate = receivedDate;
        this.startDate = startDate;
        this.requestNumber = requestNumber;
        this.status = status;
    }
}

到目前为止,我还没有为 Assignee 表建模。

我担心的是表 Submitter 除了 id 之外没有显示任何东西,有没有办法将带有 id 的数据呈现给请求列表。在这里使用@Embeddable 和@Embedded 最有意义吗,即使我已将 Request 定义为实体,我也可以这样做吗?引用使用继承的 OneToMany 双向关系的正确方法是什么。

表格如下所示,但未提供任何有用的信息。

【问题讨论】:

    标签: java spring spring-boot hibernate jpa


    【解决方案1】:

    如果您想要使用用户类的所有列创建提交者和受让人表,您有 2 个选择

    映射超类:

    您需要通过添加 @MappedSuperClass 注释并删除 @Entity@Table 注释来使用户类映射超类。

    具有 @MappedSuperClass 注释的类将不会保留在数据库中(不创建表)。

    扩展此 MappedSuperClass 的实体将继承其属性。 在数据库中,这将对应于一个 Sumbitter 表,其中包含用户类的声明和继承字段的列。

    每类策略表:

    Table per Class 策略将每个实体映射到它的表,该表包含实体的所有属性,包括继承的属性。

    为此,您需要修改继承策略注释:

    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    

    【讨论】:

      猜你喜欢
      • 2016-09-23
      • 2011-07-25
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多