Singer类@Entity
public class Singer implements Serializable{ private int SingerID;
private List<Song>songs = new ArrayList<Song>();
@Id
@GeneratedValue
public int getSingerID() {
return SingerID;
}
public void setSingerID(int singerID) {
SingerID = singerID;
}
@OneToMany(mappedBy = "singer",cascade = {CascadeType.ALL},fetch = FetchType.EAGER)
public List<Song> getSongs() {
return songs;
}
public void setSongs(List<Song> songs) {
this.songs = songs;
}
}
Song类@Entity
public class Song implements Serializable{

private int songID;  /*歌曲ID*/
private Singer singer; /*歌手*/
@Id
@GeneratedValue
public int getSongID() {
return songID;
}
public void setSongID(int songID) {
this.songID = songID;
}
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="singerID")
public Singer getSinger() {
return singer;
}
public void setSinger(Singer singer) {
this.singer = singer;
}
}
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();

Song song = new Song();
song.setSongName("songName4");
Song song1 = new Song();
song1.setSongName("songName");
Singer singer = new Singer();
singer.setSingerName("singer4");
List<Song>songs = new ArrayList<Song>();
songs.add(song);
songs.add(song1);
singer.setSongs(songs);
session.save(singer);
session.beginTransaction().commit();
保存singer后 2个Song对象虽然都能被存入到数据库中 但是singerID这列都是NULL 也就是说我用singer.getSongs();得到的都是NULL 如果我把mappedBy = "singer"去掉就可以生成中间表 singer.getSongs();就可以正常取到值  请大家帮忙看下是哪里出错了

解决方案 »

  1.   

    @Entity
    public class Singer implements Serializable{    private int SingerID;
        private List<Song>songs = new ArrayList<Song>();    你把
    private List<Song>songs = new ArrayList<Song>();    
    改成
    private List<Song>songs;
    试试。
      

  2.   

    @OneToMany(mappedBy = "SingerID",cascade = {CascadeType.PERSIST,CascadeType.REFRESH}, fetch = FetchType.LAZY, targetEntity =  Song.class)放在
    private List<Song>songs;这句上面 另外不要new
      

  3.   

    还有@JoinColumn(name="singerID")
    singerID是不是SingerID?
      

  4.   


    这里改了SingerID了 但是还是不行啊
      

  5.   

    帮你纠正几点东西啊
    1、属性命名首字母小写
    2、一个属性名中有多个单词时第二个单词首字母大写(SingerID最好写成singerId)
    3、@OneToMany(mappedBy = "SingerID",cascade = {CascadeType.PERSIST,CascadeType.REFRESH}, fetch = FetchType.LAZY, targetEntity = Song.class)这里mappedBy = "SingerID",应填属性名singerId
    4、@JoinColumn(name="singerID")这里应是表的字段名,我不知道singerID是不是你的表字段名
      

  6.   

    private int SingerID;
     这里是我不小心写错了  是singerID
      

  7.   

    我觉得应该把Song里面的cascade={CascadeType.ALL}去掉,两边都级联操作的话应该会更新两次,这样的话即使有指也会被更新为空吧,设置mappedBy = "singer"的意思不就是说主键由多的一方来维护吗?
      

  8.   

     加上这2句试试。建立2着内存间的连接。        
            song.setSinger(singer);
            song1.setSinger(singer);
      

  9.   

    mappedBy = "singer" 说明你的Singer 类不负责维护关系,所以你写的保存方法是错的,你应该反过来写,也就是说用Song 来保存 Singer !不知道你明白没有。