[英]Why can't hibernate lazily fetch @ManyToOne and @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_ProjectInfoStatuss是KM_ProjectInfo的領域,因為我想,它包含此表的外鍵的主鍵。
按照我的應用程序的邏輯,我希望在KM_PROJECT表的一行(因此在KM_ProjectInfo實體類的一個實例)與KM_PROJECT_INFO_STATUS的單行 ( KM_ProjectInfoStatus實體類的一個實例)相關聯,因為它表示特定的狀態KM_PROJECT行。
在我的代碼中,我有:
@ManyToOne
@JoinColumn(name = "idProjectInfoStatus")
private KM_ProjectInfoStatus status;
但我認為這是錯誤的,因為在我的第一個表的一行中,它與第二個表的特定單行相關聯。 但是也許我缺少有關Hibernate如何工作的信息。
您能幫我了解我的缺失嗎? 它有什么用? 為什么我有@ManyToOne而不是@OneToOne ?
特納克斯
這完全取決於您要如何建模。 就數據庫結構而言, OneToOne
和ManyToOne
的實現方式相同:
JoinColumns
,使一個外鍵指向另一個表的主鍵。 因此,這兩種解決方案都可以正確映射到您的數據庫,但這取決於您是否要允許多個KM_ProjectInfo
指向同一個KM_ProjectInfoStatus
或僅允許一個。
請注意,即使您聲明一個OneToOne,如果您沒有正確地操作Hibernate,您仍然可能以指向同一KM_ProjectInfoStatus
多個KM_ProjectInfo
結尾。
在這里,您沒有聲明反向關系,但是如果您聲明了反向關系,則聲明必須有所不同:
OneToOne
,則您將擁有KM_ProjectInfo
成員 OneToMany
( ManyToOne
反向),則您將具有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.