繁体   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