首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@JoinTable注释中的foreignKey和inverseForeignKey是什么?

@JoinTable注释中的foreignKey和inverseForeignKey是什么?
EN

Stack Overflow用户
提问于 2020-08-18 13:18:37
回答 1查看 299关注 0票数 0

我有一个我发现的项目,一个类似于这样的模式

代码语言:javascript
复制
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data

@EqualsAndHashCode
@ToString(callSuper = true)
@IdClass(QuarantinePolicyIdentity.class)
@Entity(name = PolicyServiceConstants.QUARANTINE_POLICY_TABLE)
@Table(uniqueConstraints = @UniqueConstraint(name = PolicyServiceConstants.QUARANTINE_POLICY_UNIQUE_NAME_CONSTRAINT,
        columnNames = {"customerUuid", "name"}),
        indexes = {@Index(name = PolicyServiceConstants.QUARANTINE_POLICY_UNIQUE_INDEX,
                columnList = "orderNo",
                unique = false)
        })
public class QuarantinePolicyEntity {

    @Id
    private String quarantinePolicyId;

    @Id
    @JsonIgnore
    private String customerUuid;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    @JoinTable(name = PolicyServiceConstants.QUARANTINE_POLICY_OUTBOUND_RULE_TABLE,
            foreignKey = @ForeignKey(name = PolicyServiceConstants.FOREIGN_KEY_QUARANTINE_POLICY_QPOR),
            inverseForeignKey = @ForeignKey(name = PolicyServiceConstants.FOREIGN_KEY_QUARANTINE_POLICY_ORQP))
    private Set<RuleEntity> outboundRules;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    @JoinTable(name = PolicyServiceConstants.QUARANTINE_POLICY_INBOUND_RULE_TABLE,
            foreignKey = @ForeignKey(name = PolicyServiceConstants.FOREIGN_KEY_QUARANTINE_POLICY_QPIR),
            inverseForeignKey = @ForeignKey(name = PolicyServiceConstants.FOREIGN_KEY_QUARANTINE_POLICY_IRQP))
    private Set<RuleEntity> inboundRules;

    private String createdBy;

    private Date createdDate;

    private String lastModifiedBy;

    private Date lastModifiedDate;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof QuarantinePolicyEntity)) return false;
        QuarantinePolicyEntity that = (QuarantinePolicyEntity) o;
        return com.google.common.base.Objects.equal(getQuarantinePolicyId(), that.getQuarantinePolicyId()) &&
                com.google.common.base.Objects.equal(getCustomerUuid(), that.getCustomerUuid());
    }

    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), quarantinePolicyId, customerUuid);
    }

}
  • 我无法理解foreignKeyinverseForeignKey@JoinTable中的含义。
  • 第二,我们是否必须提到FK,RuleEntity表,因为它如何知道采取哪个FK?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-08-18 13:52:08

JPA文档是怎么说的?

如果您访问JoinTable注释文档,您将发现

foreignKey (可选),用于指定或控制表生成生效时对应于joinColumns元素的列的外键约束的生成。 inverseForeignKey (可选),用于指定或控制表生成生效时对应于inverseJoinColumns元素的列的外键约束的生成。

你真的需要这些吗?

因此,您可以看到,这两个属性在模式生成期间定义了外键对比创建。不是外键本身。外键使用joinColumnsinverseJoinColumns属性定义。

现在,如果不放置这些foreignKeyinverseForeignKey,那么默认值是ConstraintMode.PROVIDER_DEFAULT,这意味着您正在使用的数据库(这里的Oracle)将决定外键约束的名称。

因此,除非您需要,否则不需要显式地提供foreignKeyinverseForeignKey。这些是可选属性。

更多改善协会的方法

  • 我不知道这是什么工作代码。但实际上这里没有正确定义OneToMany关联。没有joinColumnsinverseJoinColumns关联(所以没有什么能说明要映射哪一列)。应该用这种方式来定义关联。 @OneToMany( CascadeType.ALL = orphanRemoval,orphanRemoval= true,fetch = FetchType.LAZY) @JoinTable(name = "join_table_name",joinColumns = @JoinColumn(name = "column_a"),inverseJoinColumns = @JoinColumn(name = "column_b"),foreignKey = @ForeignKey(name = "name_of_the_constraint_for_column_a"),inverseForeignKey = @ForeignKey(name =“name_of_the_constraint_for_column_b”)私人集合outboundRules;
  • 此外,您甚至不需要一个JoinTable来建立OneToMany协会。简单地说,应该由一个JoinColumn来完成这项工作。考虑一下关联,如果它是单向的还是双向的,或者哪一方是关系的所有者。您将找到一些优化关联的选项。

更多内容如下:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63469521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档