【问题标题】:Model with Hibernate to Query by Contact Details in Spring Boot在 Spring Boot 中使用 Hibernate 查询联系人详细信息的模型
【发布时间】:2021-07-20 18:33:24
【问题描述】:

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

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

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"

              }
          }

注意:如果我错过了 pojos 中输出中的任何数据,请忽略。

【问题讨论】:

    标签: java sql hibernate jpa relation


    【解决方案1】:

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

    【讨论】:

    • 你是说因为它是一对一的,我可以把字段放在 Person 中,然后查询会变得更容易处理?你能给我举一个你写下的查询的例子吗?同时我的想法是通过电子邮件查询联系人表,获取该记录的 ID,并通过我从第一个查询中收到的联系人 ID 查询 Employee 表
    • "你是说因为它是一对一的,我可以把字段放在 Person 中,然后查询会变得更容易处理?"或多或少,是的。你需要什么样的例子?我编写了应该适用于您的模型的查询。
    • 我相信这是 SQL 中的一个例子。我可以将它与 SpringBoot 一起使用吗?对不起,Spring和hibernate的菜鸟。我想知道在这个阶段保持一对一的桌子有什么价值。有没有你能想到的特殊要求?
    • 抱歉,我不知道您的要求是什么。肯定有一些用例可能会很有趣。无论如何,我给你的 HQL 示例应该足以让你继续前进。我建议您购买一本书或阅读一些有关 JPA/Hibernate 的教程,以充分了解正在发生的事情。
    • Oracle 官方文档(docs.oracle.com/javaee/6/tutorial/doc/bnbpz.html) 可以上手了。然后这里还有几篇文章:baeldung.com/learn-jpa-hibernate 我个人喜欢 Mike Keith 写的 JPA 书,但 Joseph Ottinger 的那本书应该和我听说的一样好。
    猜你喜欢
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2012-02-21
    • 1970-01-01
    相关资源
    最近更新 更多