2014-11-22 44 views
0

我有一个与其他3个类有关的一类对象 - 歌曲集,类型,登录。 这是我的POJO类:如何在休眠状态下添加数据以及许多一对多关系

@Entity 
    @Table(name = "songs") 
    public class Song implements Serializable { 
    @Id 
    @GeneratedValue 
    @Column(name = "song_id") 
    private int songId; 

    @OneToOne(cascade = CascadeType.ALL) 
    @JoinTable(name = "albums_songs_mapping", joinColumns = @JoinColumn(name = "song_id", 
    referencedColumnName = "song_id"), inverseJoinColumns = @JoinColumn(name = 
    "album_id", referencedColumnName = "album_id")) 
    private Album album; 

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

    @Column(name = "rating") 
    private int rating; 

    @Column(name = "artists") 
    private String artist; 

    @Column(name = "composer") 
    private String composer; 

    @OneToOne(cascade = CascadeType.ALL) 
    @JoinTable(name = "genre_songs_mapping", joinColumns = @JoinColumn(name = "song_id", 
    referencedColumnName = "song_id"), inverseJoinColumns = @JoinColumn(name = 
    "genre_id", referencedColumnName = "genre_id")) 
    private Genre genre; 
} 

@Entity 
@Table(name = "albums") 
public class Album { 

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

    @Column(name = "album_name", length = 250) 
    private String albumName; 

    @OneToMany(cascade=CascadeType.ALL) 
    @JoinTable(name = "albums_songs_mapping", joinColumns = @JoinColumn(name = 
    "album_id", referencedColumnName = "album_id"), inverseJoinColumns = @JoinColumn(name 
    = "song_id", referencedColumnName = "song_id")) 
    private List<Song> songs; 
} 


@Entity 
@Table(name = "genre") 
public class Genre { 

    @Id 
    @GeneratedValue 
    @Column(name = "genre_id") 
    private int genreId; 

    @Column(name = "genre_name", length = 250) 
    private String genreName; 

    @OneToMany(cascade=CascadeType.ALL) 
    @JoinTable(name = "genre_songs_mapping", joinColumns = @JoinColumn(name = "genre_id", 
    referencedColumnName = "genre_id"), inverseJoinColumns = @JoinColumn(name = 
    "song_id",referencedColumnName = "song_id")) 
    private List<Song> songs; 
} 

@Entity 
@Table(name = "login", uniqueConstraints = {@UniqueConstraint(columnNames = 
{"user_name"})}) 
public class Login { 

    @Id 
    @GeneratedValue 
    @Column(name = "user_id") 
    private int userId; 

    @Column(name = "user_name", nullable=false) 
    private String userName; 

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

    @ManyToMany 
    @JoinTable(name = "user_songs_mapping", joinColumns = @JoinColumn(name = " user_id", 
    referencedColumnName = "user_id"), inverseJoinColumns = @JoinColumn(name = "song_id", 
    referencedColumnName = "song_id")) 
    private List<Song> songs; 
} 

我试图在我的服务这种方法。但它不起作用。也没有任何错误。请帮帮我。

public void addSong(Song song, int userId) throws Exception { 

     Session session = HibernateUtil.getSessionFactory().openSession(); 

     try { 

      session.beginTransaction(); 
      List<Song> songs = new ArrayList<Song>(); 
      songs.add(song); 
      Genre genre = song.getGenre(); 
      Album album = song.getAlbum(); 
      genre.setSongs(songs); 
      album.setSongs(songs); 
      Login login = new Login(); 
      login.setUserId(userId); 
      login.setSongs(songs); 
      session.saveOrUpdate(genre); 
      session.saveOrUpdate(album); 
      session.saveOrUpdate(login); 

      session.getTransaction().commit(); 
     } catch (HibernateException e) { 
      if (session.getTransaction() != null) { 
       session.getTransaction().rollback(); 
      } 
     } finally { 
      session.close(); 
     } 


    } 
+0

你如何确定没有任何错误?您忽略了catch块中的异常。因此,如果发生HibernateException,只需执行回滚并不知道是否有错误。我建议在catch块中添加日志记录,或者修改异常处理来确定是否首先实际发生一些错误。 – 2014-11-22 18:57:56

+0

谢谢。即使在使用saveOrUpdate方法时,我也会遇到MysqlConstraintViolation异常。 – kumuda 2014-11-23 02:47:29

回答

0

Login实体有userNamepassword属性哪些不是空的,然而,当你创建你不将它们设置并保存Login情况下,这可能是你在你的意见提MysqlConstraintViolationException的原因。

要解决它只需设置用户名和密码,然后再坚持你的实体。

希望这会有所帮助。如果它不请,请发布异常的整个堆栈跟踪,以便我们可以更好地确定代码中发生的错误。

+0

我在数据库中的genre_name和album_name上都有唯一的键约束。 org.hibernate.exception.ConstraintViolationException:无法插入:[model.Album]导致:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:在sun.reflect.NativeConstructorAccessorImpl.newInstance0处为键'album_name'重复条目'Crook' (原生方法) – kumuda 2014-11-23 03:16:23