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

时间:2014-12-31 10:22:09

标签: jpa hibernate-mapping hyperjaxb

我想更改我的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的新手,我的理解可能有点断线。有人可以建议吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

接下来,检查customization guide。据我所知,您可能需要自定义外键列的名称。这应该是可能的OOTB而不实施自定义namin策略。假设您在这里有一个one-to-many关系,这将是某个地方here。这是用于自定义的relevant part of the ORM schema。我认为您需要在此自定义join-column的名称,以便我的猜测如下:

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

Here's an example from one of the test projects

        <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在模式编译期间使用的内部组件,用于生成表,列等的名称。因此它实际上非常低级。

如果由于某种原因需要不同的命名,您可以编写和配置自己的命名策略实现。例如,请参阅this test project。但它不再是自定义,它已经扩展 Hyperjaxb。您基本上重写 Hyperjaxb的一部分。例如,如果要更改默认情况下生成所有的FK名称的方式,则可以执行此操作。我不确定这是你想要的。