Hyperjaxb 3 导入了 XSD 和 persistence.xml

Hyperjaxb 3 imported XSD and persistence.xml

这是我第一次尝试使用 Hyperjaxb3。我有一个我的 2 XSD 的片段,如下所示

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>

问题在于它会生成两个 ContractPerson 类,如下所示:

        <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>

它在部署过程中给我错误,因为

 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].

我的 Java 配置的一部分(我目前评论的)

  @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;
    }

我的问题:

  1. 两者类完全一样。我该如何选择?
  2. 我正在使用 Spring 引导,有没有办法使用 Spring 引导 java 配置 覆盖 persistence.xml

您的 classes 与您的架构中有两种不同的复杂类型不同。他们也可能引用了不同的 PersonRoleTypes,但如果没有看到您的完整架构就很难说。

虽然将这些复杂类型映射到相同的 Java class 并非不可能,但我不会这样做。这些在您的模式中是不同的类型,您也应该在 Java 中保持它们的不同。

由于 classes 具有相同的本地名称时出现问题,最简单的解决方案是重命名其中一个。使用像这样的绑定:

<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>