Spring 引导 JPA 保持多对多单向关系

Spring boot JPA persist manytomany unidirectionnal relationship

我有一个 Spring 引导项目(使用 JHipster),其中包含 2 个 JPA 实体:用户和电影。

我在它们之间创建了一个单向的多对多关系。 用户是关系的所有者。

我想将电影添加到用户(用户实体中的属性 'favorites')最喜欢的电影列表中。

但是当我尝试将电影添加到收藏夹列表时,table 'user_film_favorite' 中没有任何内容(在两个实体之间加入 table)。

映射似乎没问题,因为当我在此连接中手动输入数据时 table,我能够检索用户的电影列表。

我在这里找了很多类似的问题,但找不到问题所在。

实体用户:

@Entity
@Table(name = "jhi_user")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class User extends AbstractAuditingEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // Other properties

    @ManyToMany(cascade = CascadeType.PERSIST)
    @JoinTable(
        name = "user_film_favorite",
        joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") },
        inverseJoinColumns = { @JoinColumn(name = "movie_id", referencedColumnName = "id") }
    )
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @BatchSize(size = 20)
    private List<Film> favorites = new ArrayList<>();

实体片:

@Entity
@Table(name = "film")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Film implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @NotNull
    @Column(name = "title", nullable = false)
    private String title;

    @Column(name = "plot")
    private String plot;

    @Column(name = "rating")
    private Float rating;

电影服务:

   /**
     * Add one film to current user favorites.
     *
     * @param id the id of the film.
     * @return the film saved into user favorites.
     */
    @Transactional(readOnly = true)
    public Optional<FilmDTO> addToFavorites(Long id) {
        log.debug("Request to get Film : {}", id);
        Optional<Film> filmOpt = filmRepository.findById(id);
        // Get current logged user with his favorites
        Optional<User> userOpt = userService.getUserWithFavorites();
        if (filmOpt.isPresent() && userOpt.isPresent()) {
            User user = userOpt.get();
            user.getFavorites().add(filmOpt.get());
            userService.save(user); 
        }
        return filmOpt.map(filmMapper::toDto);
    }

用户服务:

    /**
     * Save a user.
     *
     * @param user the entity to save.
     * @return the persisted entity.
     */
    public User save(User user) {
        log.debug("Request to save User : {}", user);
        return userRepository.save(user);
    }

如果有人能帮助我,那就太好了!提前致谢:)

您正在从数据库中读取用户,因此调用保存将调用 EntityManger.merge。因此你还需要添加

CascadeType.MERGE

ManyToMany 映射。