2015-02-05 4 views
0

Я разработал несколько таблиц для моего приложения, где я поместил что-то вроде этого:связанные с JPA объекты сохраняются

product       productversion 
---        --- 
productId       productVersionId 
productVersionId (ref)    productId (ref) 
name        length 
             height 

где мы имеем отношение один ко многим. Мне просто нужен базовый продукт с параметрами, которые могут изменять и изменять параметры, чтобы я мог наблюдать за его историей. Теперь ... У меня проблема с сохранением этих объектов. Я попробовал несколько способов, это самое старое:

Product p = new Product(); 
p.name = "some name"; 
Productversion pv = new Productversion(); 
pv.length = 10; 
pv.height = 20; 
p.productversionId = pv; 

Но при попытке упорствовать этот объект я получаю ошибку, что PRODUCTID не может быть нулевым, и это относится к полю ProductID внутри объекта PRODUCTVERSION. Как я могу это сделать?

[обновление] Некоторые больше информации о моей проблеме:

public class Product implements Serializable { 
    @JoinColumn(name = "productversionId", referencedColumnName = "productversionId") 
    @ManyToOne(optional = true, cascade = CascadeType.PERSIST) 
    private Productversion productversionId; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "productId") 
    private Collection<Productversion> productversionCollection; 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "ProductId") 
    private Integer productId; 

    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 255) 
    @Column(name = "Name") 
    private String name = null; 

    // well I believe construct and getter/setter not important now 

И второй Entity:

public class Productversion implements Serializable { 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "productversionId") 
    private Collection<Productiondata> productiondataCollection; 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "productversionId") 
    private Integer productversionId; 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "parameter") 
    private float weight; 

И кстати я создаю новый объект (просто не имеют ни малейшего представления о том, как я могу это сделать):

public Product getNewProduct() { 
    if (newProduct == null) { 
     this.newProduct = new Product(); 
     Productversion pv = new Productversion(); 
     pv.setProductId(newProduct); 
     newProduct.setProductversionId(pv); 
    } 
    return newProduct; 
} 

И как я пытаюсь упорствовать объект:

public Boolean addEntry(Product productData) { 
    Boolean status = false; 
    DbConnector dc = new DbConnector(); 
    EntityManager em = dc.getEntityManager(); 

    try { 
     EntityTransaction et = em.getTransaction(); 
     et.begin(); 
     em.persist(productData); 
     et.commit(); 
     status = true; 
    } finally { 
     em.close(); 
    } 
    return status; 
} 
+0

Не могли бы вы показать код обоих классов сущностей. – SubOptimal

+0

Конечно, я обновил свой вопрос с помощью кода. – J33nn

+0

Что-то странно выглядит. В «Продукте» вы определяете отношение «ManyToOne» (productversionId) и «OneToMany» (productversionCollection) между «Продуктом» и «Productversion». Где определение 'Productiondata'. – SubOptimal

ответ

0

Похоже, что вы отсутствуете в наборе для поля id в объекте Product.

Product p = new Product(); 
p.id = 1; <<<<<<------------------- 
p.name = "some name"; 
+0

, так как идентификатор автоматически предоставляется MySQL (путем автоматического увеличения) его трудно. – J33nn

+0

Вы также можете определить свой идентификатор: '@Id @GeneratedValue long id;' – roeygol

Смежные вопросы