简体   繁体   English

Hibernate在列重命名后生成旧查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM