【问题标题】:JPA one-many gives null value after mappingJPA 一对多在映射后给出空值
【发布时间】:2012-11-28 21:52:33
【问题描述】:

有人能指出我做错了什么吗(跟进之前的问题)?

我有三个类:Dashboard、DashboardUser 和 User。

仪表板工作正常,代码如下:

 @OneToMany(cascade= CascadeType.ALL, orphanRemoval = true, mappedBy="dashboard")
    private List<DashboardUser> dashboardUsers = new ArrayList<>();

DashboardUser 包含以下两个 JPA 声明:

    @Id
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "IDUser")
    private User user;

    @Id
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "IDDashboard")
    private Dashboard dashboard;

问题出在 User.java 上:

@OneToMany(cascade= CascadeType.ALL, orphanRemoval = true, mappedBy="user")
    private List<DashboardUser> dashboardUsers;

看起来一样,但只有 Dashboard 类可以正常工作。 执行我的代码后,我的仪表板在他的属性中有一个dashboardUser,但是用户对dashboardUser 有一个空值。

数据库中的表有两个字段:IDUser 和 IDDashboard(我确实使用了正确的 userID 和 dashboardID)。有人看到我的错误吗?

【问题讨论】:

  • 包括完整的映射、生成的 SQL 以及您遇到的错误。
  • 你是在序列化数据吗,序列化时任何LAZY字段都会为空。

标签: java jakarta-ee jpa mapping one-to-many


【解决方案1】:

User添加@JoinColumn注解

@OneToMany(cascade= CascadeType.ALL, orphanRemoval = true, mappedBy="user")
@JoinColumn(name="dashBoardUserId") //Replace with actual column name
private List<DashboardUser> dashboardUsers;

我不得不猜测DashboardUser 中主键的名称,因此需要在实际代码中替换它。

在进一步查看代码后,我假设DashboardUserDashboardUser 之间的联结表,它映射了用户可以访问的仪表板。这种情况最好由@ManyToMany 关系映射。一个用户可以访问多个仪表板,而一个仪表板可能有多个用户,因此是多对多关系。以下映射将在用户和仪表板之间创建多对多关系。

User.java

public class User{

    @ManyToMany(cascade={CascadeType.ALL}, targetEntity=Dashboard.class)
        @JoinTable(name="DASHBOARD_USER", 
        joinColumns={@JoinColumn(name="IDUser", referencedColumnName="IDUser")},
        inverseJoinColumns={@JoinColumn(name="IDDashboard",       
        referencedColumnName="IDDashboard")})
     public List<Dashboard> dashboards = new ArrayList<Dashboard>();

     //Other fields/Getters/Setters 
}

Dashboard.java

@Entity
public class Dashboard{

     @ManyToMany(mappedBy="dashboards")
     private List<Users> users;

     //Other fields/Getters/Setters

}

【讨论】:

  • 感谢您的反应。主键是 IDUSer 和 IDDashboard 的组合。目前,没有单独的 PK id 字段。有没有办法将这样的复合 ID 与您提供的 joincolumn 一起使用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
  • 2015-07-02
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多