【问题标题】:Hibernate: ManyToMany map to List of OneToManyHibernate:ManyToMany 映射到 OneToMany 列表
【发布时间】:2015-12-16 16:23:40
【问题描述】:

我有三个表,我想将其中的所有数据映射到实体列表中,每个实体都包含另一个实体的列表。

  user     user_role
 ┌─────┐1 ┌──────────┐   role
 │ id  ├──┤ user_id  │* ┌─────┐
 ├─────┤ *│ role_id  ├──┤ id  │
 │name │  ├──────────┤ 1├─────┤
 └─────┘  │ given_by │  │name │
          └──────────┘  └─────┘

我想将它的数据映射到UserWithRolesAndGivers 列表。实体如下。

public class UserWithRolesAndGivers {
  private String userName;
  private List<RoleAndGiver> roleAndGivers;
}
public class RoleAndGiver {
  private String roleName;
  private String givenBy;
}

如何使用 hibernate 实现这一点?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    看起来像下面这样。当您在 user_role 表中记录附加信息 (given_by) 时,您需要一个 Join 实体“UserRole”。因此,与其在用户角色之间使用@ManyToMany,不如使用第三个实体映射@OneToMany

    @Entity
    public class User{
    
        @Id
        private Long id;
    
        @Column(name = "name")
        private String name;
    
        @OneToMany(mappedBy = "user")
        public List<UserRole> userRoles;
    }
    
    @Entity
    public class UserRole{
    
        @ManyToOne
        @JoinColumn(name = "user_id")
        private User user;
    
        @ManyToOne
        @JoinColumn(name = "role_id")
        private Role role;
    
        @Column(name = "given_by")
        private String givenBy;
    }
    
    @Entity
    public class Role{
    
        @Id
        private Long Id;
    
        @Column(name = "name")
        private String name;
    
        @OneToMany(mappedBy = "role")
        private List<UserRole> userRoles;
    }
    

    【讨论】:

    • 我只是尝试使用标准和投影将您的模型投影到我的模型上,但即使选择也导致失败。代码 session.createCriteria(User.class).list() 仅返回用户列表,但代码 session.createCriteria(User.class).setFetchMode("userRoles", FetchMode.JOIN).list() 导致 org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError)
    • 在不提供任何进一步细节的情况下说它失败并不会真正为您提供太多帮助!
    • 我按回车太早了,所以我不得不稍后添加说明。请看一看。
    • 嗯,这是一个完全独立的 JSON 映射问题。一个快速的谷歌在这里给出了解决方案; baeldung.com/…
    • 谢谢,我成功实现了!现在我可以通过session.createCriteria(User.class, "u").createAlias("userRoles", "ur").createAlias("ur.role", "r").setProjection(Projections.projectionList().add(Projections.property("u.name"), "userName").add(Projections.property("r.name"), "roleName").add(Projections.property("ur.givenBy"), "givenBy")).list() 选择相关数据,我必须按照此处stackoverflow.com/questions/11852230/… 的描述将结果分组到内存中,但这对我来说似乎不那么邪恶。
    猜你喜欢
    • 1970-01-01
    • 2011-12-15
    • 2021-10-16
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2014-11-19
    相关资源
    最近更新 更多