java - 无法使用 jaxb 将 XML 持久保存到数据库

标签 java xml hibernate jpa jaxb

我有以下 xml:

<business_partner_list>
    <business_partner>
        <business_partner_id>2004</business_partner_id>
        <business_partner_name>S. C. Johnson &amp; Sons Inc</business_partner_name>
        <last_changed_date>2016-02-02T04:04:04</last_changed_date>
        <department>
            <department_id>242</department_id>
            <department_name>TARGET.COM HARDLINES B</department_name>
        </department>
        <department>
            <department_id>98</department_id>
            <department_name>ADULT ATHLETIC &amp; MEN'S CASUAL</department_name>
        </department>
<business_partner/>
<business_partner>
        <business_partner_id>3821</business_partner_id>
        <business_partner_name>Johnson &amp; Johnson</business_partner_name>
        <last_changed_date>2016-02-02T04:04:04</last_changed_date>
        <department>
            <department_id>245</department_id>
            <department_name>OTC-PERSONAL CARE</department_name>
        </department>
        <department>
<business_partner/>
</business_partner_list>

我已经使用 JAXB 解析了它,并且能够解析它。我正在使用 Hibernate 和 jpa 来持久保存在数据库中。

因此,它创建了两个实体类:

BusinessPartner.java 和 Department.java

这两个实体应该使用 Hibernate 和 jpa 持久化到数据库。

BusinessPartner.java

@Entity(name="businessPartnerType")
public class BusinessPartnerType {

    /*@Id 
    @GeneratedValue 
    protected long businessPartnerTypeId;*/
    @Id
    @XmlElement(name = "business_partner_id", required = true)
    protected BigInteger businessPartnerId;
    @XmlElement(name = "business_partner_name", required = true)
    protected String businessPartnerName;
    @OneToMany(mappedBy="businessPartnerType")/*(targetEntity=DepartmentType.class)*/
    protected List<DepartmentType> department;  
}   

Department.java

@Entity(name="departmentType")
public class DepartmentType {

    @Id
    @XmlElement(name = "department_id", required = true)
    protected BigInteger departmentId;
    @XmlElement(name = "department_name", required = true)
    protected String departmentName;
    @XmlTransient
    @ManyToOne(cascade=CascadeType.ALL)
    protected BusinessPartnerType businessPartnerType;
}

现在我想要的是,当我使用 hibernate 和 jpa 持久保存 BusinessPartner.java 时,映射应该自动发生。但我遇到了异常:

javax.persistence.EntityNotFoundException: Unable to find target.jaxb.beans.DepartmentType with id 242
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$JpaEntityNotFoundDelegate.handleEntityNotFound(EntityManagerFactoryBuilderImpl.java:145)
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:227)
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:278)
    at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:121)
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89)
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1142)
    at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1025)
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:632)

这意味着我需要首先保留 Department.java,然后保留 BusinessPartner.java。

但是有什么方法可以让我保留 BusinessPartner.java,而 Hibernate 会自己完成剩下的工作。

最佳答案

尝试将 BusinessPartnerType 更改为:

@OneToMany(cascade=CascadeType.ALL, mappedBy="businessPartnerType")
protected List<DepartmentType> department;

这应该会导致 DepartmentType 对象自动保留。

关于java - 无法使用 jaxb 将 XML 持久保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36008766/

相关文章:

java - 如何使用 xsd :sequence? 允许元素按任意顺序排列

java - Hibernate @OneToOne child 不坚持

java - Hibernate和Oracle中的事务超时

java - 换屏时如何处理

xml - 将 XML 数据解析为不同的结构

jquery - 使用 jQuery 加载 XML - 在一行上输出自身打印

java - Hibernate 4.3(使用 Netbeans 的 JavaServer Faces)返回零行的表

java - 在 Eclipse 中使用 Hibernate 工具对 Oracle 数据库进行逆向工程

java - token ";"上的语法错误,{ 应在随机字符串创建者中的此 token 之后

java - 使用 sun.misc.Unsafe 实际上有多不安全?