Ошибка после изменения названия параметра Naturald

Я изменил имя столбца NaturalId с помощью Liquibase (с «name» на «query_name»):

<changeSet id = "rename_name_to_query_name">
    <preConditions onFail = "CONTINUE">
        <columnExists tableName = "pm_dbqueries" columnName = "name" />
        <not>
            <columnExists tableName = "pm_dbqueries" columnName = "query_name" />
        </not>
    </preConditions>
    <renameColumn
        columnDataType = "varchar(40)"
        newColumnName = "query_name"
        oldColumnName = "name"
        tableName = "pm_dbqueries"/>
</changeSet>

Он работает правильно, имя изменилось ... Я также обновил свой класс Entity в java:

@Entity
@Table( name = "pm_dbqueries", uniqueConstraints = { @UniqueConstraint(columnNames = "id"),
                                                      @UniqueConstraint(columnNames = "query_name") } )
@SequenceGenerator( name = "pm_dbqueries_seq", sequenceName = "pm_dbqueries_seq" )
public class DBQuery
{   
    @Id
    @GeneratedValue( strategy = GenerationType.AUTO, generator = "pm_dbqueries_seq" )
    @Column(name = "id", unique = true, nullable = false)
    private Long id;

    @NaturalId
    @Column(name = "query_name", unique = true, nullable = false, length = 40)
    private String queryName;

    @Column(name = "query", unique = false, nullable = false, length = 4000)
    private String query;

    public Long getId()
    {
        return id;
    }

    public void setId( Long id )
    {
        this.id = id;
    }

    public String getQueryName()
    {
        return queryName;
    }

    public void setQueryName( String queryName )
    {
        this.queryName = queryName;
    }

    public String getQuery()
    {
        return query;
    }

    public void setQuery( String query )
    {
        this.query = query;
    }
}

Но дело в том ... когда я пытаюсь выполнить это:

return (DBQuery) sessionFactory.getCurrentSession().byNaturalId(DBQuery.class).using( "query_name", name ).load();

Появляется ошибка:

org.hibernate.HibernateException: No value specified for natural-id property XXX.DBQuery#queryName
    at org.hibernate.event.spi.ResolveNaturalIdEvent.<init>(ResolveNaturalIdEvent.java:102)
    at org.hibernate.event.spi.ResolveNaturalIdEvent.<init>(ResolveNaturalIdEvent.java:52)
    at org.hibernate.internal.SessionImpl$BaseNaturalIdLoadAccessImpl.resolveNaturalId(SessionImpl.java:2466)
    at org.hibernate.internal.SessionImpl$NaturalIdLoadAccessImpl.load(SessionImpl.java:2581)

До этих изменений он работал нормально. Какие-либо предложения?

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

Cerbrus 08.05.2018 10:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
196
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте это, так как здесь вам нужно использовать имена свойств, а не имена столбцов. Раньше это работало, потому что между ними не было разницы (name == name).

return (DBQuery) sessionFactory.getCurrentSession().byNaturalId(DBQuery.class).using( "queryName", name ).load();

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

Cerbrus 08.05.2018 10:17

@Seric Пожалуйста, примите мой ответ, если он решил вашу проблему. Спасибо!

GreenTurtle 09.05.2018 10:48

@Cerbrus Спасибо, что указали на это - пока не знал, но, конечно, это имеет смысл.

GreenTurtle 09.05.2018 10:49

Другие вопросы по теме