在开发我的应用程序时,我曾经在使用数据库中的值时收到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作为数据库......
答案 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。
在这里,我得到了,我希望在实体课中有注释!我绝对不明白,为什么在我删除注释后创建了连接表,但最后,它有帮助......