![](/img/trans.png)
[英]org.hibernate.MappingException: Repeated column in mapping for collection using @JoinTable
[英]MappingException: broken column mapping during mapping one to one with joinTable
我解釋了全球背景。 我想創建一個由兩個實體組成的簡單系統,一個機構和一個員工。 我想model代理經理的概念。 事實上,一個機構只有一名經理是該機構的雇員。 一名員工只能是一個且唯一一個機構的經理。 然而,並非所有員工都是管理者。 只有一名員工是經理。 到model這個關系。 我想到了由這樣創建的連接表管理的 OneToOne 關系。
數據庫表
機構
創建表機構(id bigint 不是 null,creationDate datetime,numberOfEmployee integer,引用 varchar(255),主鍵(id))
雇員
創建表員工(Id bigint 不是 null,birthDate datetime,firstName varchar(255),性別 integer,名稱 varchar(255),socialSecurityNumber varchar(255),主鍵(Id))
代理經理
創建表 agency_manager(employee_id bigint 不是 null,agency_id bigint 不是 null,主鍵(agency_id,employee_id))
alter table agency_manager 添加約束 FKpod2iqjjd7s757fpdrk4f5fcb 外鍵 (employee_id) 引用員工 (Id)
改變表 agency_manager 添加約束 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: broken column mapping for: agencyManager.id of: org.tuto.persistence.entity.Agency
通過在關系上添加@Transient(代理中的agencyManager 和員工中的managedAgency)錯誤消失。 但是,隨着關系上的 @Transient 注釋,hibernate 無法再為我檢索它們。 但我確實想要一個映射,它允許我檢索具有關系的實體,並且能夠在沒有 AgnecyManager 關系的情況下分別保留我的 Agency 和 Employee 實體。最后,我希望能夠做這樣的事情。
//我使用龍目島@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
的目標類型中的屬性名稱,通過它定義關聯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.