Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @ManyToMany donds';t使用弹簧靴和;春季少年警讯_Java_Mysql_Postman_Many To Many - Fatal编程技术网

Java @ManyToMany donds';t使用弹簧靴和;春季少年警讯

Java @ManyToMany donds';t使用弹簧靴和;春季少年警讯,java,mysql,postman,many-to-many,Java,Mysql,Postman,Many To Many,我正在使用SpringBoot和MySQL。我试图在播放列表表中添加新的实体(歌曲)。他们有多对多的关系。但正如您在mysql查询后的回答中所看到的,它并没有保存。 其他关系正常工作 播放实体 @Data @Entity @Component @Getter @EqualsAndHashCode(exclude = "songs") @NoArgsConstructor @AllArgsConstructor @Table(name = "playlists&quo

我正在使用SpringBoot和MySQL。我试图在播放列表表中添加新的实体(歌曲)。他们有多对多的关系。但正如您在mysql查询后的回答中所看到的,它并没有保存。 其他关系正常工作

播放实体

@Data
@Entity
@Component
@Getter
@EqualsAndHashCode(exclude = "songs")
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "playlists")
public class PlaylistEntity {
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    private String id;

    private String playlistTitle;

    @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE})
    @JoinColumn(name = "user_id", nullable = false)
    private UserEntity user;

    private LocalDateTime createdAt;

    public PlaylistEntity(String playlistTitle, UserEntity user, LocalDateTime createdAt) {
        this.playlistTitle = playlistTitle;
        this.user = user;
        this.createdAt = createdAt;
    }

    @Transient
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name = "playlist_song",
            joinColumns = @JoinColumn(name = "playlist_id", nullable=false),
            inverseJoinColumns = @JoinColumn(name = "song_id", nullable=false))
    private Set<SongEntity> songs = new HashSet<>();

}
和控制器

@Slf4j
@Configuration
@RestController
@AllArgsConstructor
@RequestMapping("/user/playlists")
public class PlaylistController {

    private final PlaylistService playlistService;

    @PostMapping(value = ADD_SONG_TO_PLAYLIST_URL)
    Playlist addSongToThePlaylist(@RequestParam String playlistId, @RequestParam String songId) throws Exception {
        return playlistService.addSongToPlaylist(playlistId, songId);
    }

    @UtilityClass
    public static class Links {
        public static final String ADD_SONG_TO_PLAYLIST_URL = "/addSong";
    }
}
我用邮递员提出请求。在我提出请求后,我接受了这个答案,这表明这首歌被添加到了播放列表中。

但正如我所说,如果检查播放列表和歌曲数据库,它什么都没有。这意味着我的程序不能正确地保存多对多表。

在日志中也有例外

这样我就能明白什么是错的。
希望有人有想法。

对于SongEntity的
@EqualsAndHashCode(onlyExplicitlyIncluded=true)
,您没有任何明确包含的注释。您已经列出了一些要排除的文档,但基于上的文档,似乎需要您在使用此标志时将它们明确标记为已包含

我不能100%确定Lombok在类级别上放置此标志时会做什么,但是没有显式包含任何内容,但它似乎是一个无效状态,可能会弄乱Equals和Hashcode,从而弄乱跟踪HashSet bucket中表示要添加歌曲的项的能力

因此,我首先要解决这个问题,使您的Equals/HashCode是正确的。这看起来像是您想要完全删除
onlyExplicitlyIncluded=true
设置,或者实际添加特定的包含

下面是一个线程,它讨论了如果您想坚持该路线,请使用explicit Include:


还有,为什么在你的关系上有@Transient注释?该注释通常告诉EntityManager忽略它附加到的内容。在您的例子中,如果您正在向集合添加某些内容,但将集合标记为@Transient,那么直观地说,它不应该影响数据库中的内容。建议您删除那些希望关系/集合中对象的更改实际反映在数据库中的注释。

非常感谢,您删除所有@Transient的建议对我很有帮助。但在那之后,出现了另一个mistaGlad,你可以超越最初的问题,进入一个新的问题。请随时将此答案标记为已接受,并针对新问题构思一个新问题。请随意在评论中给我贴上标签,我会很高兴与您一起了解新问题。
@Data
@Entity
@Builder
@Getter
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "songs")
public class SongEntity {

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    private String id;

    private String title;

    private String artist;

    private String album;

    private String genre;

    @CreationTimestamp
    private LocalDateTime releaseDate;

    private int likes;

    @Transient
    @EqualsAndHashCode.Exclude
    @ManyToMany(mappedBy = "songs")
    private Set<PlaylistEntity> playlistEntities = new HashSet<>();

    @Transient
    @ManyToMany(mappedBy = "songs")
    @EqualsAndHashCode.Exclude
    private Set<SubscriptionEntity> subscriptionEntities = new HashSet<>();

    public SongEntity(String name) {
        this.title = name;
    }
}
@Repository
public interface SongRepository extends JpaRepository<SongEntity, String> {

    @Query(value="SELECT * FROM songs WHERE (:genre is null or genre = :genre) " +
            "AND (:artist IS NULL or artist = :artist)", nativeQuery=true)
    List<SongEntity> findByParams(@Param("genre") String genre, @Param("artist") String artist);

    @Query(value="SELECT * FROM songs WHERE artist = :artist", nativeQuery=true)
    List<SongEntity> findByArtist(@Param("artist") String artist);

    @Query(value="SELECT * FROM songs WHERE genre = :genre", nativeQuery=true)
    List<SongEntity> findByGenre(@Param("genre") String genre);

    @Query(value = "SELECT s.title, s.likes FROM SongEntity s WHERE s.artist = :artist")
    List<SongEntity> showSongsStatistics(@Param("artist") String artist);
}
@Transactional
public Playlist addSongToPlaylist(String playlistId, String songId) throws Exception {

    SongEntity addedSong = findSongById(songId)
    PlaylistEntity requiredPlaylist = findPlaylistById(playlistId);

    requiredPlaylist.getSongs().add(addedSong);

    PlaylistEntity updatedPlaylist = playlistRepository.save(requiredPlaylist);

    return playlistConverter.fromEntity(updatedPlaylist);
}
@Slf4j
@Configuration
@RestController
@AllArgsConstructor
@RequestMapping("/user/playlists")
public class PlaylistController {

    private final PlaylistService playlistService;

    @PostMapping(value = ADD_SONG_TO_PLAYLIST_URL)
    Playlist addSongToThePlaylist(@RequestParam String playlistId, @RequestParam String songId) throws Exception {
        return playlistService.addSongToPlaylist(playlistId, songId);
    }

    @UtilityClass
    public static class Links {
        public static final String ADD_SONG_TO_PLAYLIST_URL = "/addSong";
    }
}