Hibernate @Formula не включает схему - PullRequest
0 голосов
/ 28 июня 2018

У меня есть объект со свойством @ Formula , например:

@Entity
@Table(name = "areasAuxiliar")
public final class AreaAuxiliar implements Serializable {

    @Id
    @Column(name = "idArea")
    private Integer idArea;

    @Formula("RUTAAREA(idArea)")
    private String ruta;

когда я настраиваю свой спящий режим для указания на базу данных Oracle, у меня нет проблем, НО, когда я переключаюсь на SQLServer, hibernate не включает shema , и запрос не выполняется,

запрос, сгенерированный для спящего режима, выглядит так:

select
    areaauxili4_.idArea as idArea1_6_4_,
    rutaArea(areaauxili4_.idArea) as formula2_4_
from
    SIGAP.areasAuxiliar areaauxili4_ 

параметр hibernate.default_schema = SIGAP читается и включается в таблицу, но не в функцию,

есть ли опция / аннотация, чтобы принудительно вводить шему в этой функции?

Я пробовал hibernate 5.1 и 5.2 с тем же результатом: (

Ответы [ 4 ]

0 голосов
/ 01 августа 2018

более упрощенное решение:

Измените @Formula из этого:

@Formula("RUTAAREA(idArea)")

к этому:

@Formula("{MYAPP_SCHEMA}.RUTAAREA(idArea)")

создать класс:

public class HibernateEntityInterceptor extends EmptyInterceptor {

}

зарегистрируйте его как Entity Interceptor в вашей sessionFactory, в моем случае:

sessionFactory.setEntityInterceptor(new HibernateEntityInterceptor());

тогда в этом классе вы переопределите этот метод:

public String onPrepareStatement(String sql) {

этот метод получает команду sql перед ее выполнением, поэтому все, что вам нужно сделать, это просто заменить все:

sql = sql.replaceAll("\\{MYAPP_SCHEMA}", default_schema);
return sql;

Спасибо за помощь.

0 голосов
/ 26 июля 2018

1) Я знаю, что для собственных запросов вы можете использовать заполнитель "{h-schema}" (который заполняется значением параметра "hibernate.default_schema"):

"SELECT x FROM {h-schema}tableName"

Попробуйте и посмотрите, работает ли это случайно в @Formula ...

2) Если нет, вы также можете попытаться поиграть с подстановками (т.е. hibernate.query.substitutiontions), чтобы указать hibernate заменить литерал S на S '- в вашем случае "RUTAAREA" на "schema.RUTAAREA"?

0 голосов
/ 27 июля 2018

Не уверен, применимо ли это к функции, но вы пытались добавить свойство 'схема' к аннотации @Table:

@Entity
@Table(name = "areasAuxiliar", schema="mySchemaName")
public final class AreaAuxiliar implements Serializable {

    @Id
    @Column(name = "idArea")
    private Integer idArea;

    @Formula("RUTAAREA(idArea)")
    private String ruta;

Другое решение, преобразованное в комментарий, заключается в использовании заполнителя в аннотации @Formula

.
@Entity
@Table(name = "areasAuxiliar")
public final class AreaAuxiliar implements Serializable {

    @Id
    @Column(name = "idArea")
    private Integer idArea;

    @Formula("{SCHEMA_AND_FUNCTION}")
    private String ruta;

Затем добавьте перехватчик для заполнения значения формулы. Ссылка на решение: Заданное значение Hibernate @Formula во время выполнения

Наконец, смотрите мой комментарий о создании глобальной функции в SQLSERVER. Подробности можно найти здесь Могу ли я создать создать глобальную функцию в SQL Server?

0 голосов
/ 25 июля 2018

Вы можете использовать файл mysql-orm.xml, чтобы переопределить формулу, а затем настроить сборку так, чтобы она учитывала файл, когда база данных mysql.

Здесь переопределяем формулу:

<entity-mappings
    xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm orm_2_1.xsd"
    version="2.1">
    <package>com.acme.persistence</package>
    <entity class="AreaAuxiliar" access="FIELD">
        <attributes>
            <property name="ruta" formula="schemaName.RUTAAREA(idarea)"/>
        </attributes>
    </entity>
</entity-mappings>

Затем добавьте ссылку в конкретный persistence.xml. Затем вы переопределяете файл по умолчанию persistence.xml на этот файл в вашей сборке или во время выполнения (см. Ссылки ниже).

<persistence
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">

<persistence-unit name="persistenceUnit">

    <provider>
        org.hibernate.jpa.HibernatePersistenceProvider
    </provider>

    <mapping-file>
        mappings/identifier/global/mysql-orm.xml
    </mapping-file>

    <class>
        com.acme.persistence.AreaAuxiliar 
    </class>

</persistence-unit>

Примечание: в значительной степени вдохновлено Как изменить идентификатор Hibernate GenerationType в зависимости от базовой базы данных

Примечание (2): В блоге и здесь автор генерирует PersistenceUnitInfo во время выполнения.

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