OneToMany带注释的集合不能通过Hibernate保留

时间:2010-08-27 17:28:11

标签: java hibernate orm jpa

我目前正在尝试使用@OneToMany(cascade = CascadeType.ALL)来保存一个简单的对象列表。 Parent_Child的表在MySQL中创建,但是使用SaveOrUpdate时不会更新每个对象的键。知道问题是什么吗? (定义了我的父键并生成子项)。在使用saveOrUpdate进行持久化之前,我将子项添加到父对象的集合中。我正在使用MySQL和hibernate 3,我的auto属性设置为create-drop。

测试类:

public class Tester {
    public static void main(String[] args) {
        VideoChannel testChannel = new VideoChannel("Test Channel");
        VideoChannelMap v = new VideoChannelMap(testChannel, "Test Map");
        VideoSource sc2Vid = new VideoSource("starcraft-ii-ghost-of-the-past.mp4", "EinghersStreamingBucket");
        testChannel.add(sc2Vid);
        Session s = HibernateSessionFactory.getSession();
        s.beginTransaction();
        s.saveOrUpdate(v);
        s.close();
    }           
}

实体:

@Entity
public class VideoChannelMap {
    @Id 
    String name;

    @OneToMany(cascade=CascadeType.ALL)
    List<VideoChannel> channelMap;

    public VideoChannelMap(VideoChannel initialVid, String name)
    {
        this.name = name;
        channelMap = new ArrayList<VideoChannel>();
        channelMap.add(initialVid);
        initialVid.setParent(this);
    }
}

@Entity
public class VideoChannel {

    @Id @GeneratedValue
    Long id;
    ...
}

1 个答案:

答案 0 :(得分:2)

您必须实际提交您的交易。在事务仍然打开的情况下关闭会话时的行为定义不明确,可能取决于数据库在下面的设置方式。

Transaction t = s.beginTransaction();
s.saveOrUpdate(v);
t.commit();
s.close();

显然你应该在那里进行一些try-catch-finally动作以获得“真正的”代码;)