【问题标题】:Spring boot JPA persist manytomany unidirectionnal relationshipSpring boot JPA坚持多对多单向关系
【发布时间】:2021-11-11 00:30:07
【问题描述】:

我有一个带有 2 个 JPA 实体的 Spring Boot 项目(使用 JHipster):用户和电影。

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

我想将电影添加到用户最喜欢的电影列表中(用户实体中的属性“收藏夹”)。

但是,当我尝试将电影添加到收藏夹列表中时,表“user_film_favorite”(两个实体之间的连接表)中没有保存任何内容。

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

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

实体用户:

@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);
    }

如果有人可以帮助我,那就太好了!在此先感谢:)

【问题讨论】:

    标签: spring-boot spring-data-jpa many-to-many


    【解决方案1】:

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

    CascadeType.MERGE
    

    ManyToMany 映射。

    【讨论】:

    • 感谢您的回复。我已将 CascadeType.MERGE 添加到我的映射中,但问题仍然存在,我的联接表中没有条目。 @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinTable( name = "user_film_favorite", joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "movie_id", referencedColumnName = "id") } ) private List&lt;Film&gt; favorites = new ArrayList&lt;&gt;();
    • 为什么事务被标记为只读?删除此
    • 成功了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多