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