Переименуйте сгенерированный столбец внешнего ключа, созданный с использованием пользовательской стратегии именования.

Я хочу изменить имя столбца внешнего ключа, сгенерированного моей схемой. Ниже приведена конфигурация схемы, которую я использую:

    <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 (ID ActivityDim как внешний ключ с именем 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, мое понимание может быть немного отключено. Может кто-нибудь предложить?


person priyas    schedule 31.12.2014    source источник
comment
Вы хотите изменить стратегию именования для всех ваших внешних ключей или только для этого конкретного?   -  person zbig    schedule 31.12.2014


Ответы (1)


Отказ от ответственности: я являюсь автором Hyperjaxb.

Это предварительный ответ, возможно, нам потребуется уточнить его позже.

Прежде всего, покажите полный фрагмент схемы с ActivityDim и ActivityFact, а также то, что сгенерировано. У вас есть здесь отношения many-to-one, many-to-many или one-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 по умолчанию. Я не уверен, что это то, что вы хотите здесь.

person lexicore    schedule 01.01.2015
comment
Большое спасибо, я могу настроить имя столбца внешнего ключа. Также возможно ли, что я пишу одно правило только в одном месте (имя моего внешнего ключа должно быть похоже на имя моего элемента схемы). И это будет верно для всех генераций внешних ключей? - person priyas; 05.01.2015
comment
@priyas Если вы хотите настроить генерацию имен FK в целом, то это действительно настраиваемая стратегия именования. Вам, вероятно, потребуется переопределить этот метод. - person lexicore; 05.01.2015