Я изменил имя столбца 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)
До этих изменений он работал нормально. Какие-либо предложения?




Попробуйте это, так как здесь вам нужно использовать имена свойств, а не имена столбцов. Раньше это работало, потому что между ними не было разницы (name == name).
return (DBQuery) sessionFactory.getCurrentSession().byNaturalId(DBQuery.class).using( "queryName", name ).load();
Пожалуйста, не используйте фрагменты кода для кода, который не должен работать в браузере. Вместо этого используйте обычный блок кода.
@Seric Пожалуйста, примите мой ответ, если он решил вашу проблему. Спасибо!
@Cerbrus Спасибо, что указали на это - пока не знал, но, конечно, это имеет смысл.
Пожалуйста, не используйте фрагменты кода для кода, который не должен работать в браузере. Вместо этого используйте обычный блок кода.