我解释全局上下文。我想创建一个由两个实体组成的简单系统,一个机构和一个员工。我想树立代理经理的概念。事实上,一个只有一名经理的机构是该机构的雇员。一个雇员只能是一个机构的经理。然而,并非所有员工都是经理。只有一名员工是经理。为这种关系建模。我想到了由这样创建的联接表管理的OneToOne关系。
数据库表
代理
创建表代理(id bigint不为null,creationDate datetime,numberOfEmployee integer,引用varchar(255(,主键(id((
雇用
创建表employee(Id biint不为null,birthDate datetime,firstName varchar(255(,性别整数,name varchar(225(,socialSecurityNumber varchar(255(,主键(Id(
AgentyManager
创建表agency_manager(employee_id bigint not null,agency_idbigint不为null,主键(agency_id,employee_id(
更改表代理_管理员添加约束FKpod2iqjjd7s757fpdrk4f5fcb外键(employee_id(引用employee(id(
更改表代理_管理员添加约束FK6mfhp2sc5ntk1grf8kqhyq4we外键(agency_id(引用代理(id(
@Entity
@Table(name = "agency")
public class Agency {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long id;
String reference;
Integer numberOfEmployee;
Calendar creationDate;
@OneToOne(mappedBy = "manager")
// @Transient
AgencyManager agencyManager;
}
@Entity
@Table(name = "employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long Id;
String name;
String firstName;
Gender gender;
Calendar birthDate;
String socialSecurityNumber;
@OneToOne(mappedBy = "agency")
//@Transient
AgencyManager managedAgency;
public boolean isAgencyManager(){
return managedAgency!=null;
}
}
@Entity
@Table(name = "agency_manager")
public class AgencyManager {
@EmbeddedId
AgencyManagerPK id;
@OneToOne
@JoinColumn(name = "agency_id",insertable = false,updatable = false)
Employee manager;
@ManyToOne
@JoinColumn(name = "employee_id",insertable = false,updatable = false)
Agency agency;
}
@Embeddable
public class AgencyManagerPK implements Serializable {
@Serial
private static final long serialVersionUID = 7474913724940112916L;
@OneToOne
@JoinColumn(name = "employee_id")
Employee manager;
@ManyToOne
@JoinColumn(name = "agency_id")
Agency agency;
}
我对这个映射的问题是我有一个错误org.hibernate.MappingException:org.tuto.persistence.entity.agencyManager.id的列映射已损坏
通过在关系中添加@Transient(Agency中的agencyManager和Employee中的managedAgency(,错误消失了。然而,有了关系上的@Transient注释,hibernate无法再为我检索它们。但我确实想要一个映射,它将允许我检索具有该关系的实体,并且能够在没有AgnecyManager关系的情况下单独保存我的Agency和Employee实体。最后,我希望能够做这样的事情。
//我使用lombok@Builder
Employee employee=Employee.builder().name("Simple") .firstName("Employee") .socialSecurityNumber("112345") .gender(Gender.MALE) .build(); Agency agency = Agency.builder() .reference("ONLY8976GYT7") .numberOfEmployee(39) .build(); EntityManager em = JpaUtils.getEmF().createEntityManager(); em.getTransaction().begin(); em.persist(agency); em.persist(employee); AgencyManagerPK agencyManagerPK = AgencyManagerPK.builder() .manager(employee) .agency(agency). build(); AgencyManager agencyManager= AgencyManager.builder() .id(agencyManagerPK) .build(); employee.setManagedAgency(agencyManager); agency.setAgencyManager(agencyManager); em.persist(agencyManager); em.getTransaction().commit();
我不能。请帮帮我
必须在Agency
实体中使用@OneToOne(mappedBy = "agency")
,在Employee
实体中使用@OneToOne(mappedBy = "employee")
。mappedBy
成员是指关联AgencyManager
的目标类型中的属性的名称,通过该名称来定义关联。