繁体   English   中英

Spring实体之间的相互关系

[英]Spring mutual relationship of entities

我有以下用户实体。

@Entity
@JsonIgnoreProperties(value = {"createdAt", "updatedAt", "roles", "enabled",
    "authorities", "credentialsNonExpired", "accountNonLocked", "accountNonExpired"})
@Data
@Accessors(chain = true)
public class User extends Base implements UserDetails, Serializable {

@Size(min = 4, max = 20)
@NotNull
private String username;

@NotNull
private String password;

@NotNull
@Email
private String email;

@ElementCollection(fetch = FetchType.EAGER)
private List<Role> roles = new ArrayList<>();

private List<Book> bookList = new ArrayList<>();

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    return roles.stream().map(r -> new SimpleGrantedAuthority(r.toString())).collect(Collectors.toList());
}

@Override
public boolean isAccountNonExpired() {
    return true;
}

@Override
public boolean isAccountNonLocked() {
    return true;
}

@Override
public boolean isCredentialsNonExpired() {
    return true;
}

@Override
public boolean isEnabled() {
    return true;
}
}

我希望用户有一个书籍清单,但我在不同的试验中面临不同类型的错误。 当我将 @OneToMany 注释放在 bookList 属性上时,出现此错误

failed to lazily initialize a collection of role: com.example.demo.model.User.bookList, could not initialize proxy - no Session

在某些消息来源中,它说使用 @OneToMany 就像 @OneToMany(mappedBy = "xxx", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 在这种情况下,在 Book 实体中,我应该添加用户属性并使用 @ManyToOne但我不希望书实体具有用户属性。 我该如何处理?

这是用户服务中的 getBooks 方法。

@Transactional
public GenericResponse findAllBooks(User user) {
    Objects.requireNonNull(user);
    return genericResponseService.createResponseNoError(user.getBookList());
}

而且我不能在同一个模型中 fetchtype 急切属性,它会抛出

Unable to build Hibernate SessionFactory; nested exception is org.hibernate.loader.MultipleBagFetchException

注意:我不想使用 EAGER 提取类型。

根据我的理解,您希望将User映射到Book作为 OneToMany。 但只有一个方向,从用户到图书,而不是相反。 为此,您可以使用单向 OneToMany 映射。

public class User extends Base implements UserDetails, Serializable {
    ...

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name="book_id")
    private List<Book> bookList = new ArrayList<>();

    ....
}

注意:为此您需要JPA2.X ,它不受JPA1.0支持。 您可以在此处了解有关如何使用@JoinColumn更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM