JPA:在父母子女关系中 - >父级未更新

时间:2018-01-29 09:18:56

标签: jpa eclipselink h2

在开发我的应用程序时,我曾经在使用数据库中的值时收到NullPointerException。此值是在父子关系中设置的。经过一些调试后我看到,这个值从未被数据库更新过。 代码如下所示:我有两个实体,首先创建父实体,稍后创建子代。在创建之后,父级将更新。此更新从未由基础数据库执行。 创建的代码是:

    ...
    EntityManager em = Activator.getEntityManager();

    Customer c = Customerem.createQuery("SELECT p FROM Customer c WHERE c.name=:arg")
        .setParameter("arg", "abc").getSingleResult();

    em.getTransaction().begin();
    CustomerRelation cr = new CustomerRelation();
    cr.setCustomerId("123");
    cr.setAccessCode("456");
    cr.setCustomer(c);

    em.flush(); 

    c.addCustomerRelation(cr);
    em.persist(c);
    em.persist(cr);

    em.getTransaction().commit();

在查看数据库的日志时,我可以看到CustomerRelation的INSERT语句,但没有关于客户的信息......我在这里想念什么?

顺便说一下,这是实体类:

@Entity
public class Customer
{
    @Id
    @GeneratedValue
    protected int cId;

    @OneToMany (mappedBy="customer", cascade={CascadeType.PERSIST, CascadeType.MERGE})  
    protected List<CustomerRelation> relations;

    ... other fields, Getter/Setter, etc.

    public void addCustomerRelation(CustomerRelation relation) 
    {
        if (relations == null)
        {
            relations = new ArrayList<CustomerRelation>();
        }
        if (!this.relations.contains(relation))
        {
            this.relations.add(relation);
        }
        relation.setPerson(this);
    }
}

@Entity
public class CustomerRelation 
{
    @Id
    @GeneratedValue
    protected int rId;

    @ManyToOne(targetEntity=Person.class)
    @JoinColumn(name="PERSON", referencedColumnName="pId")
    protected Person person;

    @Basic
    protected String customerId;

    @Basic
    protected String accessCode;

    ... other fields, Getter/Setter, etc.
}

作为附加信息:我使用Eclipselink和H2作为数据库......

1 个答案:

答案 0 :(得分:0)

我真的不知道为什么,但现在我有一个有效的解决方案。由于我整天都很无助,所以我最后只是在实体课中评论了这些内容:

...
//@OneToMany (mappedBy="customer", cascade={CascadeType.PERSIST, CascadeType.MERGE})  
    protected List<CustomerRelation> relations;
....

在评论完之后,我只是尝试了最后一次并查看了日志。在那里,我找到了这些线:

  

[EL Config]:metadata:2018-01-29 21:29:52.207 - 元素[字段   关系]被默认为一对多的映射。

     

[EL Config]:metadata:2018-01-29 21:29:52.207 - 目标实体   (引用)一对多映射元素的类[字段   关系]被默认为:阶级   de.mho.finpim.persistence.model.CustomerRelation。

所以我向下滚动了一下,发现了这个:

  

[EL Config]:metadata:2018-01-29 21:29:52.214 - 连接表名称   对于多对多的映射[字段关系]被默认为:   CUSTOMER_CUSTOMERRELATION。

     

[EL Config]:metadata:2018-01-29 21:29:52.214 - 源主键   正在进行多对多映射[字段关系]的列名   违约:CID。

     

[EL Config]:metadata:2018-01-29 21:29:52.214 - 源外键   多个映射[关系]的列名正在   默认为:Customer_PID。

     

[EL Config]:metadata:2018-01-29 21:29:52.214 - 目标主键   正在进行多对多映射[字段关系]的列名   违约:RID。

     

[EL Config]:metadata:2018-01-29 21:29:52.214 - 目标外键   多个映射[关系]的列名正在   默认为:relations_RID。

在这里,我得到了,我希望在实体课中有注释!我绝对不明白,为什么在我删除注释后创建了连接表,但最后,它有帮助......