簡體   English   中英

MappingException:在與 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM