【问题标题】:Many to many relation ship gives null多对多关系给出 null
【发布时间】:2021-07-14 22:25:28
【问题描述】:

使用 Spring Data 和 mysql 作为持久层在多对多映射中遇到一些问题

    @Getter
    @Setter
public class BusinessUnitEntitiy extends AbstractTenantEntity implements Auditable{

    private static final long serialVersionUID = -1123383144979037984L;



    @Column(name = "NAME")
    String name;
    

    @Column(name = "DESCRIPTION")
    String description;
    
    @ManyToMany(fetch = FetchType.LAZY,mappedBy = "businessUnits" )
    private Set<User> businessUsers;

    public Set<User> fetchBusinessUsers() {
        return businessUsers;
    }
    
    @Column(name = "DISPLAY_SEQUENCE_NUM")
    protected Long displaySequenceNum;
    
    @Column(name = "UNIQUE_SEQUENCE_ID",unique = true)
    protected String uniqueSequenceId;
}


@Getter
@Setter
public class User extends AbstractTenantEntity {
    
    private static final long serialVersionUID = 65981149772133526L;

    @Column(name = "PROVIDER_USER_ID")
    private String providerUserId;

    private String email;

    @Column(name = "enabled", columnDefinition = "BIT", length = 1)
    private boolean enabled;

    @Column(name = "DISPLAY_NAME")
    private String displayName;

    private String password;

    private String provider;

    @Column(name = "DISPLAY_SEQUENCE_NUM")
    protected Long displaySequenceNum;
    
    @Column(name = "UNIQUE_SEQUENCE_ID",unique = true)
    protected String uniqueSequenceId;
    
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
        name = "business_unit_user", 
        joinColumns={@JoinColumn(name ="user_id")}, 
        inverseJoinColumns = { @JoinColumn(name="business_unit_id") }
    )
    Set<BusinessUnitJpaEntitiy> businessUnits;

}

从 businessunit 获取用户效果很好

但是从用户那里获取 businessunits 会给出 null 集,即使更新同一个用户也只会保留新链接的 businessunit 旧值消失

【问题讨论】:

    标签: mysql hibernate spring-data-jpa


    【解决方案1】:

    如果您将用户保留在事务中而不初始化 businessUnits 字段,这就是您所得到的。要么在持久化之前正确初始化集合,要么在持久化之后分离用户,以便从数据库重新加载用户并正确初始化集合。

    【讨论】:

      【解决方案2】:

      你可以试试这个

      @ManyToMany
      @JoinTable(
          name = "business_unit_user", 
          joinColumns={@JoinColumn(name ="user_id",referencedColumnName = "id")}, 
          inverseJoinColumns = { @JoinColumn(name="business_unit_id",referencedColumnName = "id") }
      )
      Set<BusinessUnitJpaEntitiy> businessUnits;
      

      你必须为每个属性设置 setter 和 getter

      【讨论】:

      • 谢谢,我尝试了这种方法并在类级别添加了 getter 和 setter,但得到相同的 null 结果
      猜你喜欢
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多