Java JPA - 持久化@OneToMany实体

时间:2016-01-21 01:59:09

标签: java database jpa runtime-error

大家好,

我现在遇到了持久对象@OneToMany的问题。我遇到问题的地方在于我正在尝试创建两个对象(一个是OneToMany,另一个是ManyToOne),我想要保留@OneToMany,并自动将@ManyToOne持久存储到数据库中。 (所有表都设置为自动增量,并且在Komponenta.class的构造函数中初始化Collection,我只放置了与此问题相关的部分)。这是我的代码:

public class Komponenta implements Serializable {

@Id
private Integer idKom;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "idKom")
private Collection<Ima> imaCollection = new ArrayList<>();

}

public class Ima implements Serializable {

@Id
private Integer idIma;

@JoinColumn(name = "idKom", referencedColumnName = "idKom")
@ManyToOne
private Komponenta idKom;

}

    // runnable part
    Tools.em.getTransaction().begin();

    Komponenta k = new Komponenta();
    Ima i = new Ima();

    Collection<Ima> list = k.getImaCollection();
    list.add(i);
    k.setImaCollection(list);      

    i.setIdKom(k);

    Tools.em.persist(k);
    Tools.em.getTransaction().commit();

我从控制台输出中收到此类错误:

  

内部异常:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:列'idKom'不能为null   错误代码:1048

2 个答案:

答案 0 :(得分:0)

您可以将值设置为idKom实例的Komponenta

让id自动生成

@Id
@GeneratedValue(strategy=GenerationType.AUTO)//Use strategy accoringly
private Integer idKom;

答案 1 :(得分:0)

要使用MySQL AUTO_INCREMENT列,您应该使用IDENTITY策略:

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer idKom;

使用带有MySQL的AUTO时会得到以下内容:

@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Integer idKom;

实际上相当于

@Id @GeneratedValue
private Integer idKom;