簡體   English   中英

為什么在此Hibernate映射中使用@ManyToOne代替@OneToOne?

[英]Why in this Hibernate mapping it is used @ManyToOne instead @OneToOne?

我對Hibernate開發絕對是陌生的,並且遇到以下問題。

我有2個實體類,它們映射2個數據庫表:

1)第一個實體類(主要的實體類)名為KM_ProjectInfo,並映射一個名為KM_PROJECT的數據庫表。

2)第二實體類名為KM_ProjectInfoStatus並映射命名KM_PROJECT_INFO_STATUS一個DB表。

因此,第二個代表第一個的特定字段(由KM_ProjectInfo類的實例表示的行的狀態)。 事實上,我有這樣的事情:

1) KM_ProjectInfo類:

@Entity
@Table(name = "KM_PROJECT")
public class KM_ProjectInfo implements Serializable {

    @Id
    @GeneratedValue
    private Long idProjectInfo;

    @Column(name = "name")
    private String name;

    @Column(name = "technology")
    private String technology;

    @ManyToOne
    @JoinColumn(name = "idCountry")
    private KMCountry country;

    @Column(name = "power")
    private long power;

    @Column(name = "cod")
    private String cod;

    @ManyToOne
    @JoinColumn(name = "idProjectInfoStatus")
    private KM_ProjectInfoStatus status;

    // GETTERS & SETTERS

}

2) KM_ProjectInfoStatus

@Entity
@Table(name = "KM_PROJECT_INFO_STATUS")
public class KM_ProjectInfoStatus implements Serializable {

    @Id
    @GeneratedValue
    private Long idProjectInfoStatus;

    @Column(name = "foldertech")
    private Long foldertech;

    @Column(name = "folderproject")
    private Long folderproject;

    // GETTERS & SETTERS

}

所以,你可以在上面的代碼片段看到,KM_ProjectInfoStatussKM_ProjectInfo的領域,因為我想,它包含此表的外鍵的主鍵。

按照我的應用程序的邏輯,我希望在KM_PROJECT表的一行(因此在KM_ProjectInfo實體類的一個實例)與KM_PROJECT_INFO_STATUS單行KM_ProjectInfoStatus實體類的一個實例)相關聯,因為它表示特定的狀態KM_PROJECT行。

在我的代碼中,我有:

@ManyToOne
@JoinColumn(name = "idProjectInfoStatus")
private KM_ProjectInfoStatus status;

但我認為這是錯誤的,因為在我的第一個表的一行中,它與第二個表的特定單行相關聯。 但是也許我缺少有關Hibernate如何工作的信息。

您能幫我了解我的缺失嗎? 它有什么用? 為什么我有@ManyToOne而不是@OneToOne

特納克斯

這完全取決於您要如何建模。 就數據庫結構而言, OneToOneManyToOne的實現方式相同:

  • 一個或多個JoinColumns ,使一個外鍵指向另一個表的主鍵。

因此,這兩種解決方案都可以正確映射到您的數據庫,但這取決於您是否要允許多個KM_ProjectInfo指向同一個KM_ProjectInfoStatus或僅允許一個。

請注意,即使您聲明一個OneToOne,如果您沒有正確地操作Hibernate,您仍然可能以指向同一KM_ProjectInfoStatus多個KM_ProjectInfo結尾。

在這里,您沒有聲明反向關系,但是如果您聲明了反向關系,則聲明必須有所不同:

  • 如果是OneToOne ,則您將擁有KM_ProjectInfo成員
  • 如果是OneToManyManyToOne反向),則您將具有Collection<KM_ProjectInfo>成員

從描述看來,您似乎想要一對一的關系。 也就是說,項目實體應具有其自己的狀態,其他任何項目都不應共享。 您可以通過使用@OneToOne如下實現。

@Entity
@Table(name = "KM_PROJECT")
public class KM_ProjectInfo implements Serializable {

    @Id
    @GeneratedValue
    private Long idProjectInfo;

    @OneToOne
    @JoinColumn(name = "idProjectInfoStatus")
    private KM_ProjectInfoStatus status;
}

@Entity
@Table(name = "KM_PROJECT_INFO_STATUS")
public class KM_ProjectInfoStatus implements Serializable {

    @Id
    @GeneratedValue
    private Long idProjectInfoStatus;

   @OneToOne(mappedBy="idProjectInfoStatus")
   private KM_ProjectInfo project;
}

這樣,您可以具有KM_PROJECT的特定狀態。

回到@ManyToOne,如果您想與多個項目共享相同的狀態,那么您將希望擁有這個,但這並不是您要的情況。 我試圖在這里一對一映射中以簡單的方式解釋映射。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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