【问题标题】:Spring Data JPA/Hibernate OneToMany remove ManyToOne ChildSpring Data JPA/Hibernate OneToMany 删除 ManyToOne Child
【发布时间】:2014-03-24 17:08:23
【问题描述】:

我遇到以下问题:

我有 3 个 Pojo 的

  • 艺术家
  • 专辑
  • 跟踪

Artist 与 Album 具有 OneToMany 关系,Album 与 Track 具有 OneToMany 关系。

艺术家.class

@Entity
public class Artist {

    @Id
    @GeneratedValue
    @Column(name = "artist_id")
    private long artist_id;

    @Column(name = "artist_name", nullable = false, length = 32)
    private String artist_name;

    @Column(name = "artist_bio", nullable = false, length = 255)
    private String artist_bio;

    @Lob
    @Basic(fetch = FetchType.EAGER)
    @Column(name = "artist_avatar")
    private byte[] artist_avatar;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "artist", orphanRemoval = true)
    private List<Album> albumList;

专辑.class

@Entity
public class Album {

    @Id
    @GeneratedValue
    @Column(name = "album_id")
    private long album_id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "artist_id", nullable = false)
    private Artist artist;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "album", orphanRemoval = true)
    private List<Track> trackList;

    @Column(name = "album_name", nullable = false, length = 32)
    private String album_name;

    @Column(name = "album_description", nullable = false, length = 255)
    private String album_description;

    @Lob
    @Basic(fetch = FetchType.EAGER)
    @Column(name = "album_avatar")
    private byte[] album_avatar;

Track.class

@Entity
public class Track {

    @Id
    @GeneratedValue
    @Column(name = "track_id")
    private long track_id;

    @Column(name = "track_no", nullable = false, length = 2)
    private String track_no;

    @Column(name = "track_name", nullable = false, length = 32)
    private String track_name;

    @Column(name = "track_length", nullable = false, length = 32)
    private String track_length;

    @Column(name = "track_file", nullable = false, length = 128)
    private String track_file;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "album_id", nullable = false)
    private Album album;

Track Controller.class

@RequestMapping(value = "/track", params = "delete", method = RequestMethod.POST)
@Transactional
public String postDeleteTrack(@RequestParam Long album_id, Long track_id) {
    trackService.deleteTrack(track_id);
    return "redirect:album/" + album_id;
}

跟踪服务.class

public void deleteTrack(Long track_id) {
    trackRepository.delete(track_id);
}

TrackRepository.class

@Repository
public interface TrackRepository extends CrudRepository<Track, Long>{
}

当我调用 trackService.deleteTrack(track_id);我的 MySQL 数据库中的轨道没有被删除。 Hibernate 只是给了我很多选择语句作为输出。

感谢您提供任何帮助,如果您需要我提供更多信息,请随时询问。

【问题讨论】:

  • 你能发布你的删除方法吗?
  • 你是否从专辑曲目列表中删除了曲目?
  • 我的删除方法只是我从 spring-data 中使用的存储库。 @Repository 公共接口 TrackRepository extends CrudRepository{ } 你能更好地向我解释一下删除专辑 trackList 集合是什么意思吗?我对像 hibernate 这样的 orm 框架没有太多经验。
  • 我也有同样的问题。你找到让它工作的方法了吗?
  • 有一段时间了,但我认为我得到这个工作的方式是:
      @OneTomany(mappedBy = album) List<track> 曲目; @ManyToOne @JoinColumn(name = "album_id") 私人相册专辑; </track>

标签: spring hibernate spring-data-jpa


【解决方案1】:

在你的存储库方法中,添加这个

@Query("delete  from Track t where t.id=:id") 
void  delete(@Param("id")String id);

由于您没有覆盖级联策略,默认级联策略是无,我相信这会起作用。 参考-http://docs.jboss.org/hibernate/orm/5.0/manual/en-US/html_single/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 2019-02-24
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 2012-12-20
    相关资源
    最近更新 更多