1

我想更改我的 Schema 生成的外键列的名称。以下是我正在使用的架构配置:

    <xs:complexType name="ActivityFact">
        <xs:sequence>
                    <!-- Other Element Declaration -->
        </xs:sequence>
        <xs:attribute name="id" type="xs:long" />
    </xs:complexType>

当我运行此配置时,我得到了 2 个表:1. ActivityDim 2. ActivityFact(ActivityDim Id 作为外键,名称为 activityDim_ActivityFact_Id)

我想将上面生成的名称更改为在这种情况下为 actvitiyDim 的架构元素名称。我不确定如何使用自定义命名策略。我试图覆盖 foreignKeyColumnName 方法,但没有奏效

public class ForeignKeyNamingStrategy extends ImprovedNamingStrategy {

    private final static Logger logger = LoggerFactory.getLogger(ForeignKeyNamingStrategy.class);

    @Override
    public String foreignKeyColumnName(
            String propertyName, String propertyEntityName, String propertyTableName, String referencedColumnName
    ) {
        return  propertyName; 
    }

我还在我的 persistence.xml 中给出了这个类的引用

<persistence version="2.0"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd
http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <persistence-unit name="reportingData">
        <!-- These properties are defined in persistence-model/src/main/resources/persistence.xml. 
            HyperJAXB3 merges them into its generated and final persistence.xml -->
        <properties>
            <property name="hibernate.ejb.naming_strategy"
                value="com.namingStrategy.ForeignKeyNamingStrategy" /></properties>
    </persistence-unit>
</persistence>

我是 Hibernate 的新手,我的理解可能有点脱节。有人可以建议吗?

4

1 回答 1

0

免责声明:我是 Hyperjaxb 的作者。

这是一个初步的答案,我们可能需要稍后对其进行改进。

首先,请显示完整的模式片段ActivityDim以及ActivityFact生成的内容。你在这里有many-to-onemany-to-manyone-to-many关系吗?

接下来,查看定制指南。据我了解您的问题,您可能需要自定义外键列的名称。在不实施自定义命名策略的情况下,这应该是可能的 OOTB。假设您在这里有one-to-many关系,这将在此处的某个地方。这是用于自定义的 ORM 模式的相关部分。我认为您需要自定义join-column此处的名称,所以我的猜测是:

        <hj:one-to-many>
            <orm:join-column name="actvitiyDim"/>
        </hj:one-to-many>

以下是其中一个测试项目的示例

        <xs:element name="one-to-many-join-column" type="test:two" minOccurs="0" maxOccurs="unbounded">
            <xs:annotation>
                <xs:appinfo>
                    <hj:one-to-many>
                        <orm:join-column name="O2MJC_ONE_ID"/>
                    </hj:one-to-many>
                </xs:appinfo>
            </xs:annotation>
        </xs:element>

可能与您的情况非常接近。

现在,命名策略。

命名策略与 Hibernate 或 JPA 无关。命名策略是 Hyperjaxb3 在模式编译期间使用的内部组件,用于生成表、列等的名称。因此它实际上是非常底层的。

如果您出于某种原因想要不同的命名,您可以编写和配置自己的命名策略实现。例如,参见这个测试项目。但它不再是定制,它已经在扩展Hyperjaxb。您基本上会重写Hyperjaxb 的一部分。例如,如果您想更改所有FK 名称的默认生成方式,您可以这样做。我不确定这是你想要的。

于 2015-01-01T14:06:36.743 回答