使用 Hibernate 进行模型以在 Spring Boot 中按联系人详细信息进行查询

问题描述

我希望能够通过联系方式查询员工。 这是我的模型。

你可以假设我有控制器工作。

public abstract class BaseEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    public boolean isNew() {
        return this.id == null;
    }
}

public abstract class Personalinformation extends BaseEntity {
    @Temporal(TemporalType.DATE)
    private Date dateOfBirth;
    private String gender;
}


public abstract class Person extends Personalinformation implements Serializable {

    private String firstName;
    private String lastName;
    private String middleName;
    private String alias;

    @Temporal(TemporalType.DATE)
    private Date dateOfBirth;
    private String gender;

    @OnetoOne(cascade = CascadeType.ALL)
    private Contact contact;

}

public class Owner extends Person implements Serializable {
}

public class Contact extends BaseEntity {
    private String emailAddress;
    private String mobileTelNo;
    private String homeTelNo;
    private String workTelNo;
}

这是我尝试过的,认为持久性将是双向的,当我构建控制器时,我可以构建响应以包含所有者或员工或我可能在我的系统中拥有的其他实体联系人

public class Contact extends BaseEntity {
    private String emailAddress;
    private String mobileTelNo;
    private String homeTelNo;
    private String workTelNo;
    
    @OnetoOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    private Owner owner;
    
    @OnetoOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    private Employee employee;
}

联系人与所有者或任何其他可能拥有联系人的实体之间的关系是一对一的。

有人可以帮我将实体映射到另一个,以便数据持久化吗? 我想做的事情是好的做法,还是有更好的方法

通过电子邮件查询时所需的输出

GET: http://localhost:8080/v1/contact/email/jow.doe@stackoverflow.com

{
              "firstName": "Joe","lastName": "Doe","middleName": "None","alias": "JD","dateOfBirth": "2000-02-12","gender": "male","contact": {
                  "emailAddress": "joe.doe@stackoverflow.com"

              }
          }

注意:如果我遗漏了 pojo 输出中的任何数据,请忽略。

解决方法

IMO Contact 不应有任何到 OwnerEmployee 的映射。如果您不需要它,请不要映射它。您可以使用 HQL 查询(如 FROM Owner o JOIN o.contact c WHERE c.emailAddress = :email)来查询数据。