[英]Hibernate generate old query after column renaming
I've renamed column in my database (from configuration_SYSTEM_ID to SYSTEM_ID), and added AttributeOverride annotation to my AbstractSubConfiguration class. 我已经在我的数据库中重命名了列(从configuration_SYSTEM_ID到SYSTEM_ID),并将AttributeOverride注释添加到了我的AbstractSubConfiguration类。 But hibernate ignore this annotation and continue generate queries with old column names (configuration_SYSTEM_ID instead of SYSTEM_ID). 但是hibernate会忽略此批注并继续使用旧列名生成查询(configuration_SYSTEM_ID而不是SYSTEM_ID)。
My classes looks like this: 我的课程看起来像这样:
AbstractSubConfiguration.java AbstractSubConfiguration.java
@MappedSuperclass
@IdClass(Configuration.class)
public class AbstractSubConfiguration implements Dto, Serializable {
private static final long serialVersionUID = -6271877313478924753L;
@Id
@OneToOne(fetch = FetchType.LAZY)
@AttributeOverride(name = "systemId", column = @Column(name = "SYSTEM_ID"))
private Configuration configuration;
public AbstractSubConfiguration() {
super();
}
public AbstractSubConfiguration(final Configuration configuration) {
super();
this.configuration = configuration;
}
@XmlTransient
public final Configuration getConfiguration() {
return configuration;
}
public final void setConfiguration(final Configuration configuration) {
this.configuration = configuration;
}
}
Configuration.java Configuration.java
Entity(name = "CONFIGURATION")
public class Configuration implements Dto, Serializable {
private static final long serialVersionUID = 6601197795258837065L;
@EmbeddedId
private ConfigurationId configurationId;
@Column(name = "CONFIGURATION_NAME")
private String configurationName;
@OneToOne(cascade = CascadeType.PERSIST, mappedBy = "configuration", fetch = FetchType.EAGER)
private BasicConfiguration basicConfiguration;
@OneToOne(cascade = CascadeType.PERSIST, mappedBy = "configuration", fetch = FetchType.EAGER)
private AdvancedConfiguration advancedConfiguration;
.....
...
}
ConfigurationId.java ConfigurationId.java
@Embeddable
public class ConfigurationId implements Serializable {
private static final long serialVersionUID = -5123943430808049180L;
private SystemId systemId;
@Column(name = "CONFIGURATION_ID")
private int configurationId;
public ConfigurationId(final SystemId systemId, final int configurationId) {
super();
this.systemId = systemId;
this.configurationId = configurationId;
}
....
....
}
And as a result I have an error 2695 [main] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Unknown column 'tes0_.configuration_SYSTEM_ID' in 'field list' 因此我有一个错误2695 [main] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - '字段列表'中的未知列'tes0_.configuration_SYSTEM_ID'
From doc @AttributeOverride 来自doc @AttributeOverride
java.lang.String name (Required) The name of the property whose mapping is being overridden if property-based access is being used, or the name of the field if field-based access is used. java.lang.String name(必需)如果正在使用基于属性的访问,则覆盖其映射的属性的名称,或者如果使用基于字段的访问,则为字段的名称。
In your mapping I don't see systemId
property instead I see configurationId
property 在您的映射中,我没有看到systemId
属性,而是看到configurationId
属性
Edit 编辑
Accordance your editing name in @AttributeOverride
should be configuration.systemId
按照@AttributeOverride
的编辑名称应该是configuration.systemId
See example from java doc with zipcode: 请参阅带有zipcode的java doc示例:
@Embeddable public class Address {
protected String street;
protected String city;
protected String state;
@Embedded protected Zipcode zipcode;
}
@Embeddable public class Zipcode {
protected String zip;
protected String plusFour;
}
@Entity public class Customer {
@Id protected Integer id;
protected String name;
@AttributeOverrides({
@AttributeOverride(name="state",
column=@Column(name="ADDR_STATE")),
@AttributeOverride(name="zipcode.zip",
column=@Column(name="ADDR_ZIP"))
})
@Embedded protected Address address;
...
}
Resolved it in this way: 以这种方式解决了它:
@MappedSuperclass
@IdClass(Configuration.class)
public class AbstractSubConfiguration implements Dto, Serializable {
private static final long serialVersionUID = -6271877313478924753L;
@Id
@OneToOne(fetch = FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "SYSTEM_ID", referencedColumnName = "SYSTEM_ID"),
@JoinColumn(name = "configuration_CONFIGURATION_ID", referencedColumnName = "CONFIGURATION_ID")})
private Configuration configuration;
...
....
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.