繁体   English   中英

重命名使用自定义命名策略生成的生成的外键列

[英]Rename the generated foreign key column generated using custom Naming Strategy

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

    <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_ActivityFact_Id的外键的ActivityDim 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的新手,我的理解可能会有点疏远。 有人可以建议吗?

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

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

首先,请显示带有ActivityDimActivityFact的完整架构片段以及生成的内容。 您在这里有many-to-onemany-to-manyone-to-many关系吗?

接下来,查看自定义指南 据我了解您的问题,您可能需要自定义外键列的名称。 如果不执行自定义的namin策略,这可能是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名称的方式,可以执行此操作。 我不确定这就是您想要的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM