【问题标题】:JavaEE 1:1 Unidirectional RelationshipJavaEE 1:1 单向关系
【发布时间】:2014-01-22 16:43:39
【问题描述】:

当我从我的实体类自动生成表时,JPA 如何处理 1:1 单向关系与我自己创建 SQL 表时如何制作这些表时,我感到困惑。

我的问题是如何设置外键。

假设我有一个这样的客户实体和一个地址实体:

@Entity
public class Customer{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToOne(cascade = CascadeType.ALL)
    private Address address;

    //setters and getters
}

@Entity
public class Address{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String streetName;

    //setters and getters

}

如果我从这两个实体类生成 sql 表,那么 Customer 表将有一个引用 Address 表的外键列。

有没有办法建立 OneToOne 单向关系,其中 JPA 将外键粘贴在目标表(地址表)上,而不是像我的代码示例中那样粘贴在 Customer 表上,还是我必须这样做双向关系并使用@Mapping 注解显示更明确的所有权以实现这种表结构?

【问题讨论】:

    标签: mysql jakarta-ee jpa


    【解决方案1】:

    要让外键出现在另一个表中以实现 1-1 单向关系,您需要切换“拥有”端:将客户放在地址中并从客户中删除地址。然后客户的外键将在地址表中。

    【讨论】:

      【解决方案2】:

      首先,您必须从 Customer 实体映射您的 address_id(或类似的东西)。例如,使用下面的代码,您将引用客户的地址。

      @OneToOne(cascade = CascadeType.ALL)
      @JoinColumn(name="ADDRESS_ID")
      private Address address;
      

      在从地址表中删除任何条目时,您必须首先从客户表中删除该条目以避免外键违规错误。然后您可以从地址表中删除。从表中删除任何行时,JPA 不会处理这种关系。

      【讨论】:

      • 我已将我的问题编辑得更清楚一点,对于任何混淆,我深表歉意。我的映射在我的代码中按原样工作并且存在关系,它只是将外键放在客户表上,我希望它放在地址表上,基本上是反向关系。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多