使用 Hibernate 建模以在 Spring 启动时通过联系方式查询
Model with Hibernate to Query by Contact Details in 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@whosebug.com
{
"firstName": "Joe",
"lastName": "Doe",
"middleName": "None",
"alias": "JD",
"dateOfBirth": "2000-02-12",
"gender": "male",
"contact": {
"emailAddress": "joe.doe@whosebug.com"
}
}
注意:如果我遗漏了 pojo 输出中的任何数据,请忽略。
IMO Contact
不应与 Owner
或 Employee
有任何映射。如果您不需要它,请不要映射它。您可以使用 FROM Owner o JOIN o.contact c WHERE c.emailAddress = :email
.
等 HQL 查询来查询数据
我希望能够通过联系方式查询员工。 这是我的模型。
你可以假设我有控制器在工作。
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@whosebug.com
{
"firstName": "Joe",
"lastName": "Doe",
"middleName": "None",
"alias": "JD",
"dateOfBirth": "2000-02-12",
"gender": "male",
"contact": {
"emailAddress": "joe.doe@whosebug.com"
}
}
注意:如果我遗漏了 pojo 输出中的任何数据,请忽略。
IMO Contact
不应与 Owner
或 Employee
有任何映射。如果您不需要它,请不要映射它。您可以使用 FROM Owner o JOIN o.contact c WHERE c.emailAddress = :email
.