代码之家  ›  专栏  ›  技术社区  ›  Zed

多对一休眠

  •  0
  • Zed  · 技术社区  · 8 年前

    基本上我有两个不同的表,我想把它们和另一个表连接起来。当你有类似的情况 User Account 你想把它们链接到 Settings 桌子,因为 设置 表可以存储 用户 或者为了一个 账户 是的。也许这不是最好的设计,但这正是我要用hibernate来实现的。我见过很多一对一的例子,但有可能是这样的吗?

    Table1 
      [id..]
    
             -> Table3
                 [id...]
    Table2
      [id...]
    

    我将使用id属性链接 Table 1 具有 Table3 ,以及 Table2 具有 表3 . 有人能为这个场景提供一个示例实现吗?

    2 回复  |  直到 8 年前
        1
  •  0
  •   Dzmitry Kalachou    8 年前

    是的,这是可能的。您可以将此JPA映射用于设计:

    @Entity
    @Table(name = "user")
    public class User {
    
        @Id 
        @Column(name = "id")
        private Long id;
    
        @OneToOne(fetch = FetchType.LAZY, mappedBy = "user")
        private Setting setting;
    
        // getters/setters, etc.
    
    }
    
    
    @Entity
    @Table(name = "account")
    public class Account {
    
        @OneToOne(fetch = FetchType.LAZY, mappedBy = "account")
        private Setting setting;
    
        // getters/setters, etc.
    }
    
    
    @Entity
    @Table(name = "setting")
    public class Setting {
    
        @Id 
        @Column(name = "id")
        private Long id;
    
        @OneToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "account_id")
        private Account account;
    
        @OneToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "user_id")
        private User user;
    
        // getters/setters, etc.
    
    }
    
        2
  •  0
  •   Leviand    8 年前

    您可以通过以下方式满足您的需要:

    1)用户表:

    @Table(name = "User")
    public class User {
        @OneToOne(mappedBy = "settingColumnName")
        private Settings setting;
    }
    

    2)账表:

    @Table(name = "Account")
    public class Account {
        @OneToOne(mappedBy = "settingColumnName")
        private Settings setting;
    }
    

    2)设置表:

    @Table(name = "Settings")
    public class Settings{
        @OneToOne()
        @JoinColumn(name = "userColumnName")
        private User user;
    
        @OneToOne()
        @JoinColumn(name = "accountColumnName")
        private Account account;
    }