[英]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.