【问题标题】:Error after changing name of Naturald parameter更改 Naturald 参数名称后出错
【发布时间】:2018-10-18 01:27:30
【问题描述】:

我已使用 liquibase 更改 NaturalId 列名称(从“名称”更改为“查询名称”):

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

它工作正常,名称已更改...我还在 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)

在进行这些更改之前它运行良好。有什么建议吗?

【问题讨论】:

  • 请不要将代码 sn-ps 用于不应在浏览器中运行的代码。请改用普通代码块。

标签: java database hibernate rename liquibase


【解决方案1】:

试试这个,因为你需要在这里使用属性名而不是列名。它更早地起作用了,因为两者之间没有区别(name == name)。

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

【讨论】:

  • 请不要将代码 sn-ps 用于不应在浏览器中运行的代码。请改用普通代码块。
  • @Seric 如果它解决了您的问题,请考虑接受我的回答。谢谢!
  • @Cerbrus 感谢您指出这一点 - 到目前为止还不知道,但它当然很有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2019-07-02
  • 1970-01-01
相关资源
最近更新 更多