Java JPA - 持久化@OneToMany 实体

Java JPA - Persisting @OneToMany entity

大家好,

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

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

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

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'idKom' cannot be null Error Code: 1048

要么将值设置为 Komponenta 个实例的 idKom

让id自动生成

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

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

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

将 AUTO 与 MySQL 一起使用时会得到什么:

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

实际上相当于

@Id @GeneratedValue
private Integer idKom;