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:
Your classes are not the same as you have two different complex types in your schema. They also probably reference different PersonRoleType
s, 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>