MappingException:在使用joinTable进行一对一映射的过程中,列映射中断



我解释全局上下文。我想创建一个由两个实体组成的简单系统,一个机构和一个员工。我想树立代理经理的概念。事实上,一个只有一名经理的机构是该机构的雇员。一个雇员只能是一个机构的经理。然而,并非所有员工都是经理。只有一名员工是经理。为这种关系建模。我想到了由这样创建的联接表管理的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的目标类型中的属性的名称,通过该名称来定义关联。

最新更新