Spring Hibernate ManyToMany - PullRequest
       0

Spring Hibernate ManyToMany

1 голос
/ 06 марта 2012

У меня есть 2 таблицы, VIDEO, VIDEOCATEGORY и таблица присоединения VIDEO2VIDEOCATEGORY.Я пытаюсь сделать много-много аннотаций.При компиляции нет ошибок или предупреждений.

База данных пуста в начале.Я пытаюсь сохранить видео сущность (со списком VideoCategory) .. в это время все исправить.Новое видео добавлено в базу данных.Также добавлены некоторые новые категории.Затем я пытаюсь добавить новое видео с новыми уникальными категориями ... также правильно.Проблема в том, когда я пытаюсь добавить новое видео с уже существующими в БД категориями.До этой попытки у меня есть 2 записи в VIDEO2VIDEOCATEGORY ("cat1", 3) и ("cat2", 3) ... после попытки должно быть 2 новых записи - ("cat1", 4) и ("cat2", 4) и 2 существующих ("cat1", 3) и ("cat2", 3), но старых нет в БД.Они были переписаны 2 новыми записями.

Как это решить?Мои коды:



   import java.io.Serializable;
    import java.util.List;

    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.JoinTable;
    import javax.persistence.ManyToMany;

    import org.hibernate.annotations.Cascade;


    @Entity
    public class VideoCategory implements Serializable{

        private static final long serialVersionUID = -722840296120424003L;

        @Id 
        @Column(name = "id", unique = true, nullable = false)
        private String id;


        @ManyToMany(fetch=FetchType.EAGER)
        @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
        @JoinTable(name = "video2videocategory",
              joinColumns = {@JoinColumn(name = "cat_id")}, inverseJoinColumns =       @JoinColumn(name = "vid_id"))
          private List videos;


        public VideoCategory(){
        }

        public VideoCategory(String id) {
            super();
            this.id = id;
        }
        public String getId() {
            return id;
        }
        public void setId(String id){
            this.id = id;
        }
        public List getVideos() {
            return videos;
        }
        public void setVideos(List videos) {
            this.videos = videos;
        }

        @Override
        public String toString() {
            return "VideoCategory [id=" + id + ", videos=" + videos + "]";
        }
    }


    import java.io.Serializable;
    import java.util.Date;
    import java.util.List;

    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.EnumType;
    import javax.persistence.Enumerated;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.JoinTable;
    import javax.persistence.ManyToMany;
    import javax.persistence.SequenceGenerator;
    import javax.persistence.JoinColumn;

    import org.hibernate.annotations.Cascade;



    @Entity
    @SequenceGenerator(
        name="VID_SEQ_GEN",
        sequenceName="VIDSEQ",
        allocationSize=1
    )
    public class Video implements Serializable {

        private static final long serialVersionUID = 2284488937952510797L;

        @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="VID_SEQ_GEN")
        @Column(name = "id", unique = true, nullable = false)
        private Long id;

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

        @Column(name = "video_path", unique = false, nullable = false)
        private String videoPath;

        @Column(name = "video_type", unique = false, nullable = false)
        @Enumerated(value=EnumType.STRING) 
        private VideoType videoType;

        @Column(name = "creation_date", unique = false, nullable = false)
        private Date creationDate;

        @ManyToMany
        @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
         @JoinTable(name = "video2videocategory", 
                 joinColumns = {@JoinColumn(name = "vid_id")}, inverseJoinColumns = @JoinColumn(name = "cat_id"))
        private List categories;



        public Video(){
        }


        public Long getId() {
            return id;
        }
        public void setId(Long id) {
            this.id = id;
        }
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        public String getVideoPath() {
            return videoPath;
        }
        public void setVideoPath(String videoPath) {
            this.videoPath = videoPath;
        }
        public VideoType getVideoType() {
            return videoType;
        }
        public void setVideoType(VideoType videoType) {
            this.videoType = videoType;
        }
        public Date getCreationDate() {
            return creationDate;
        }
        public void setCreationDate(Date creationDate) {
            this.creationDate = creationDate;
        }
        public List getCategories() {
            return categories;
        }

        public void setCategories(List categories) {
            this.categories = categories;
        }

        @Override
        public String toString() {
            return "Video [id=" + id + ", creationDate="
                    + creationDate + ", title=" + title
                    + ", videoPath=" + videoPath + ", videoType=" + videoType + "]";
        }
    }


Я пробовал аннотации jpa и hibernate.

Пожалуйста, помогите.

1 Ответ

2 голосов
/ 06 марта 2012

Ошибка, вероятно, в том, что вы определили отношение «многие ко многим» как родитель с обеих сторон. Одна сторона должна быть ребенком, как это:

@ManyToMany(mappedBy = "categories") // in the class VideoCategory
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...