【问题标题】:Many to one relation with inherited objects - Postgres与继承对象的多对一关系 - Postgres
【发布时间】:2019-07-29 22:56:51
【问题描述】:

我正在构建一个需要单个登录页面的应用程序。但是,有两种“类型”的用户:客户和培训师。我的域如下所示:

      User
        |
  +-----+-----+
  |           |
Person     Trainer

我的用户将包含电子邮件、密码等,因此我可以使用此表来验证我的登录请求。

一个 Trainer 应该存储一个人员列表,一个人应该有 1 个 trainer。

一对多的工作,培训师可以存储 Person 类对象的列表,但我无法通过客户端链接回培训师。

这是我的用户类:

package com.example.demo.model;

import javax.persistence.*;

@Entity
@Inheritance
@Table(name="users")
public abstract class User {

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

    private String email;

    public User(){}

    public User(String email) {
        this.email = email;
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

Person 类:

package com.example.demo.model;

import javax.persistence.*;

@Entity
public class Person extends User {

    @Column
    private int age;

    @ManyToOne
    @JoinColumn
    private Trainer trainer;

    public Person(){}

    public Person(String email, int age) {
       super(email);
        this.age = age;
    }
}

培训师课程:

package com.example.demo.model;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
public class Trainer extends User {

    @Column
    private String description;

    @OneToMany(mappedBy = "trainer", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Person> clients;

    public Trainer(){}

    public Trainer(String email, String description) {
        super(email);
        this.description = description;
    }

    public void addClient(Person person){
        this.clients = new ArrayList<>();
        this.clients.add(person);
    }
}

我应该如何通过 ManyToOne 注释访问客户的培训师?或者还有其他选择吗? 提前致谢!

【问题讨论】:

  • “我无法通过客户端链接回培训师”是什么意思?什么客户?是什么阻止你这样做?
  • 培训师的 id 没有作为外键添加到我的 postgres 数据库中的客户端实体
  • 您是否在Person 中设置了对Trainer 的引用?这是关系中控制保存内容的部分。
  • 我确实忘记参考我的教练了!我以为它会自动映射。感谢您的帮助!

标签: spring jpa inheritance spring-data-jpa mapping


【解决方案1】:

不要在addClient() 中初始化列表。您正在覆盖/删除现有客户端。在字段声明中进行。

@OneToMany(...)
private List<Person> clients = new ArrayList<>();

设置关系的两边:

public void addClient(Person person){
    person.setTrainer(this);
    this.clients.add(person);
}

【讨论】:

  • 干得不错!我认为@ManyToOne 注释会自动将培训师映射到客户端。感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
相关资源
最近更新 更多