简体   繁体   English

如何在具有许多一对多关系的休眠状态下添加数据

[英]How to add data in hibernate with many one-to-many relationships

I am having a Song class which has one-to-many relationship with other 3 classes - Album,Genre,Login. 我的Song类与其他3个类(唱片集,流派,登录)具有一对多的关系。 These are my POJO classes: 这些是我的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;  
}  

I have tried this method in my service . 我已经在服务中尝试了这种方法。 But it is not working. 但这是行不通的。 There aren't any errors either. 也没有任何错误。 Please help me. 请帮我。

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();  
        }  


    }  

Your Login entity has userName and password attributes which aren't nullable, yet you don't set them when you create and save the Login instance, which is probably the cause of the MysqlConstraintViolationException you mention in your comment. 您的Login实体具有不能为空的userNamepassword属性,但是在创建和保存Login实例时未设置它们,这可能是您在注释中提到的MysqlConstraintViolationException的原因。

To fix it just set the username and password before persisting your entity. 要解决此问题,只需在保留实体之前设置用户名和密码即可。

Hope this helps. 希望这可以帮助。 If it doesn't please post the whole stack trace of the exception so we can better determine what exactly fails in your code. 如果没有,请发布异常的整个堆栈跟踪信息,以便我们更好地确定代码中到底发生了什么。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM