javaxmlhyperjaxb

Hyperjaxb 3 imported XSD and persistence.xml


This is my first attempt of using Hyperjaxb3. I have a snippet of my 2 XSD as shown below

ContractFullInfo.xsd

<xsd:import namespace="http://homecredit.net/homerselect/common/v1" schemaLocation="Common.xsd"/>

<xsd:element name = "ContractFullInfoRequest">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="systemEvent" type="common:ContractSystemEventType"/>
            <xsd:element name="data" type="ContractFullInfo"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

<xsd:complexType name="ContractPerson">
    <xsd:sequence>
        <xsd:element name="cuid" type="xsd:long"/>
        <xsd:element name="personRole" type="PersonRoleType"/>
    </xsd:sequence>
</xsd:complexType>

Common.xsd

<xsd:complexType name="ContractPerson">
    <xsd:sequence>
        <xsd:element name="cuid" type="xsd:long"/>
        <xsd:element name="personRole" type="PersonRoleType"/>
    </xsd:sequence>
</xsd:complexType>

The problem with this it generates two ContractPerson classes as shown below:

        <class>net.homecredit.homerselect.common.v1.ContractPerson</class> <==
        <class>net.homecredit.homerselect.common.v1.MoneyDto</class>
        <class>net.homecredit.homerselect.contract.v3.BankAccount</class>
        <class>net.homecredit.homerselect.contract.v3.ClosedEndParameter</class>
        <class>net.homecredit.homerselect.contract.v3.ContractBase</class>
        <class>net.homecredit.homerselect.contract.v3.ContractCommodity</class>
        <class>net.homecredit.homerselect.contract.v3.ContractDocument</class>
        <class>net.homecredit.homerselect.contract.v3.ContractEvent</class>
        <class>net.homecredit.homerselect.contract.v3.ContractFullInfo</class>
        <class>net.homecredit.homerselect.contract.v3.ContractFullInfoRequest</class>
        <class>net.homecredit.homerselect.contract.v3.ContractParameter</class>
        <class>net.homecredit.homerselect.contract.v3.ContractPerson</class> <==
        <class>net.homecredit.homerselect.contract.v3.ContractService</class>
        <class>net.homecredit.homerselect.contract.v3.RefinancedContract</class>
        <class>net.homecredit.homerselect.contract.v3.RevolvingParameter</class>

and it gives me error during deployment as

 Entity name must be unique in a persistence unit. Entity name [ContractPerson] is used for the entity classes [net.homecredit.homerselect.common.v1.ContractPerson] and [net.homecredit.homerselect.contract.v3.ContractPerson].

A portion of my Java configuration (which I currently commented)

  @Bean
    public DataSource dataSource() throws NamingException {
        return (DataSource) new JndiTemplate().lookup(env.getProperty("spring.datasource.jndi-name"));
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws NamingException {
        LocalContainerEntityManagerFactoryBean em
                = new LocalContainerEntityManagerFactoryBean();
        em.setPackagesToScan(new String[]{"net.homecredit.homerselect.contract.v3"});
        em.setPersistenceUnitName("net.homecredit.homerselect.common.v1:net.homecredit.homerselect.contract.v3");
        em.setJtaDataSource(dataSource());

        Properties properties = new Properties();
        properties.setProperty("hibernate.dialect", env.getProperty("spring.jpa.properties.hibernate.dialect"));
        properties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("spring.jpa.hibernate.ddl-auto"));
        em.setJpaProperties(properties);

        return em;
    }

My questions:

  1. Both classes are exactly the same. How can I pick one ?
  2. I am using Spring Boot, is there a way to override persistence.xml using Spring Boot java configuration?

Solution

  • Your classes are not the same as you have two different complex types in your schema. They also probably reference different PersonRoleTypes, but it's hard to say without seeing your complete schemas.

    While it's not impossible to map these complex types onto the same Java class, I won't do it. These are distinct types in your schemas, you should keep them distinct in Java as well.

    Since you get a problem with classes having the same local name, the easiest solution would be to rename one of them. Use a binding like:

    <jaxb:bindings
        version="1.0"
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:hj="http://hyperjaxb3.jvnet.org/ejb/schemas/customizations"
        xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
        jaxb:extensionBindingPrefixes="xjc hj orm">
    
        <jaxb:bindings schemaLocation="Common.xsd" node="/xs:schema">
            <jaxb:bindings node="xs:complexType[@name='ContractPerson']">
                <jaxb:class name="CommonContractPerson"/>
            </jaxb:bindings>
        </jaxb:bindings>
    </jaxb:bindings>