2012-03-05 10 views
1

私は2つのテーブル、ビデオ、ビデオコンポジション、およびビデオ会議ビデオ会議を持っています。 私は多対多の注釈を作成しようとしています。コンパイル時にエラーや警告はありません。春の休止状態ManyToMany

データベースは最初は空です。私はビデオエンティティ(VideoCategoryのリストを持つ)を維持しようとする。この時点ではすべて修正されている。新しいビデオがデータベースに追加されます。いくつかの新しいカテゴリも追加されています。次に、私は新しいユニークなカテゴリを持つ新しいビデオを追加しようとします...同様に正しい。問題は、DBに既に存在するカテゴリの新しいビデオを追加しようとするときです。この試みの前に、私はVIDEO2VIDEOCATEGORY( "cat1"、3)と "cat2"、3)の2レコードを持っています... attempの後に2つの新しいレコード - ( "cat1"、4)と "cat2" )と既存の2つ( "cat1"、3)と( "cat2"、3)が古いものはDBにありません。彼らは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を試してみましたが、注釈を休止しています。

助けてください。

+0

が、それはあなたが '新しいVideo'メイクを追加することを考えてone.When新しいを作成し、それをしませ更新しているのようなあなたの' save() 'メソッドは思わ表示それは実際には既存のものではなく、新しいビデオのインスタンスであることを確かめてください。あなたのマッピングが正しい問題は 'save()'か、実際にはそうではない新しいインスタンスのビデオだと思われます。 – Shahzeb

+0

public void save(ビデオビデオ){ \t \t getHibernateTemplate()。save(video); \t \t} – falconseye

+0

私はidのないVideoの新しいインスタンスを作成しています。これを保存しようとしています。 – falconseye

答えて

2

おそらく、多対多の関係を両側で親として定義している可能性があります。 このように一つの側面は、子供のようになります。

@ManyToMany(mappedBy = "categories") // in the class VideoCategory