【问题标题】:How to map two foreign keys mapping to the same primary key column in Hibernate (one-to-one)?如何将两个外键映射到Hibernate中的同一主键列(一对一)?
【发布时间】:2011-08-10 21:17:27
【问题描述】:

我是 Java 和 Hibernate 的新手,我正在尝试在 Hibernate 中映射以下场景(使用注释)。

我正在处理以下两个表(与某些 ETL 类型的任务相关)。

任务
|-任务ID
|-SourceDatabase(数据库表的 FK)
|-TargetDatabase (FK to the Databases 表)

数据库
|-DatabaseId (PK)
|-TaskId(任务表的 FK)
|-其他数据库详细信息。

每个任务都有一个 sourceDatabase 和一个 targetDatabase。此外,每个数据库都与一个任务相关。 如何在 Hibernate 中使用一对一映射映射到这个模型。

@Entity
public class Task implements Serializable
{
    @Id
    int taskId;

    //How to map  using one-to-one mapping??
    Database sourceDB;
    //how to map  using one-to-one mapping??
    Database targetDB;
}

@Entity
public class Database implements Serializable
{
    @Id
    int databaseId;

    //How to map using one-to-one mapping??
    Task task;  
}

我已从上述代码示例中删除了所有不必要的代码。 提前致谢!!

【问题讨论】:

    标签: hibernate orm jpa


    【解决方案1】:

    据我了解,您有 3 个独立的一对一关系及其各自的外键,因此您可以将它们映射为正常的一对一关系:

    @Entity
    public class Task implements Serializable
    {
    ...
        @OneToOne @JoinColumn(name = "SourceDatabase")
        Database sourceDB;
    
        @OneToOne @JoinColumn(name = "TargetDatabase")
        Database targetDB;
    }
    
    @Entity
    public class Database implements Serializable
    {
         ...
         @OneToOne @JoinColumn(name = "TaskId")
        Task task;  
    }
    

    【讨论】:

    • 谢谢 Axtavt!我对@mappedby 注释感到困惑。不确定何时需要@mappedby?
    • @crazyfor:mappedBy用于链接同一双向关系的两侧。由于您的关系使用自己的外键,因此您有单独的单向关系,不需要mappedBy
    【解决方案2】:

    我正在使用 mappedBy --for 两个外键映射到 Hibernate 中的同一主键列进行搜索(一对一)?(用于双向关系)

    稍作修改的场景——如下所示

    Tasks
        |-TaskId
        |-SourceDatabase (FK to the Databases table)
        |-TargetDatabase (FK to the Databases table)
    
    Databases
        |-DatabaseId (PK)
        |-Other database details.
    

    我已从 @axtavt 获取代码并针对 mappedBy 进行了修改,以便对其他人有所帮助

      @Entity
       public class Task implements Serializable
       {
        ...
          @OneToOne @JoinColumn(name = "SourceDatabase")
          Database sourceDB;
    
          @OneToOne @JoinColumn(name = "TargetDatabase")
          Database targetDB;
       }
    
       @Entity
       public class Database implements Serializable
      {
         ...
           @OneToOne(cascade = {CascadeType.ALL},mappedBy = "sourceDB")
           Task taskSource; 
    
          @OneToOne(cascade = {CascadeType.ALL},mappedBy = "targetDB")
          Task taskTarget; 
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-16
      • 2021-11-20
      • 2016-09-18
      • 2014-11-22
      • 2014-06-15
      • 2022-01-16
      • 1970-01-01
      • 2013-12-09
      相关资源
      最近更新 更多