1

我的项目中有一张非常重要的表格 - 强制表格。它有几列,但在这种情况下,最重要的是主键。

Mandatory
1. id (Long Primary Key)
...

现在我必须添加两个新表 - 附加表和额外表。它们都只有两列。在附加中,两者都是主键。如您所见,其中之一也是外键。

Additional
1. mandatory_id (Long Primary Key FK -> Mandatory.id)
2. description (Varchar(512) Primary Key)

在 Extra table 中,主键也是外键。

Extra
1. mandatory_id (Long Primary Key FK -> Mandatory.id)
2. text (Varchar(512) 

我正在考虑如何在我的项目中使用 Hibernate 实现它。

我已经以这种方式声明了它们(这里没有 getter、setter 等),MandatoryEntity类:

@Entity
@Table(name = "mandatory")
public class MandatoryEntity {

    @OneToMany
    @JoinColumn(name = "mandatory_id")
    protected List<AdditionalEntity> additonals;

    @OneToOne
    @JoinColumn(name = "mandatory_id")
    protected ExtraEntity extra;
}

AdditionalEntity班级:

@Entity
@Table(name = "additional")
public class AdditionalEntity {

    @EmbeddedId
    private AdditionalPK id;

    @ManyToOne(fetch = FetchType.LAZY)
    @Fetch(value = FetchMode.JOIN)
    @JoinColumn(name = "mandatory_id", nullable = false, insertable = false, updatable = false)
    protected MandatoryEntity mandatory;
}

AdditionalPK班级:

@Embeddable
public class AdditionalPK {

    @Column(name = "mandatory_id")
    private Long mandatoryId;

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

ExtraEntity班级:

@Entity
@Table(name = "extra")
public class ExtraEntity {

    @Id
    @Column(name = "mandatory_id")
    private Long id;

    @OneToOne 
    @PrimaryKeyJoinColumn
    protected MandatoryEntity mandatory

    @Column(name = "text")
    protected String text;
}

此时我正在使用的笔记本电脑坏了,所以我有时间考虑一下。我在 JPA 规范@SecondaryTables注释中找到了。我可以在我的情况下使用这个注释吗?这些只是两个表,每个表只有两列。第一个有复合主键,第二个没有。

也许还有另一种方法可以在一个表中实现这些表MandatoryEntity?没有两个新实体:AdditionalEntityExtraEntity

4

1 回答 1

1

首先,让我重新表述一下我从您的要求中理解的内容。

  1. 您有一个主要实体(必填)
  2. 您有两个其他实体指定强制实体的附加信息。其中

    一个。可以指定多个附加信息(ManyToOne)

    湾。可以指定一个额外信息(OneToOne)

通常这是一个非常基本的用例。您必须在这里决定的一件事是您是否需要双向映射或单向映射(仅通过强制实体访问)就足够了。我希望单向映射对于您的用例来说是一个不错的选择,因为 Mandatory 似乎是您的根实体。在您的代码中,您尝试对双向关系进行建模,但忘记指定相反的关系。这实际上会导致两个独立的关系。您应该像这样指定双向关系的目标:


@Entity
@Table(name = "mandatory")
public class MandatoryEntity {
    // you need a mapped by to mark the relation as bidirectional
    @OneToMany(mappedBy = "mandatory")
    protected List additonals;
    @OneToOne
    protected ExtraEntity extra;
}

@Entity @Table(name = "additional") public class AdditionalEntity { @EmbeddedId private AdditionalPK id; @ManyToOne(fetch = FetchType.LAZY) protected MandatoryEntity mandatory; }

您还指定了许多示例中不需要的附加映射信息,这使得一切看起来都太复杂了。另外,您为什么要使用嵌入式密钥?我认为自动生成的密钥也适合您。我对您的模型的建议如下:


@Entity
@Table(name = "mandatory")
public class MandatoryEntity {
    @Id
    @GeneratedValue(strategy =  GenerationType.AUTO)
    private Long id;
// you need a mapped by to mark the relation as bidirectional
    @OneToMany(mappedBy = "mandatory")
    protected List additonals;
    @OneToOne
    protected ExtraEntity extra;
}
@Entity
@Table(name = "additional")
public class AdditionalEntity {
    @Id
    @GeneratedValue(strategy =  GenerationType.AUTO)
    private Long id;
    @ManyToOne(fetch = FetchType.LAZY)
    protected MandatoryEntity mandatory;
}
@Entity
@Table(name = "extra")
public class ExtraEntity {
    // you might also not use auto-value here and set the id to the id of the owning
    // mandatory entity
    @Id
    @GeneratedValue(strategy =  GenerationType.AUTO)
    private Long id;
    @Column(name = "text")
    protected String text;
}

如果我遗漏了一些要求并且我提出的映射不适用于您的情况,那么请添加有关您的要求的更多信息,我们可以进一步讨论。

于 2012-10-30T13:53:43.050 回答