Java Spring JPA Hibernate未更新列

sq1bmfud  于 2023-01-19  发布在  Java
关注(0)|答案(2)|浏览(149)

我使用的是Spring 4.1.0和休眠实体管理器4.1.9
另外,我使用的是Postgres 9.6
我有以下实体:

@Entity
@Table(name = "audit", schema = "public")
@SequenceGenerator(name = "AUDIT_SEQUENCE", sequenceName = "AUDIT_SEQUENCE", allocationSize = 1, initialValue = 1)
public class AuditTrail {

        @Id
        @Column(name = "auditid", unique = true)
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "AUDIT_SEQUENCE")
        private long auditId;

        @Column(name = "auditvalue")
        private String auditValue;

        ... getter setters ...
}

这给出了字符变化的列结构(255)。
我想将auditValue列的长度更新为10000。因此,我将实体更新为:

@Column(name = "auditvalue", length = 10000)
private String auditValue;

但列结构不会更新。
我的应用程序上下文. xml包含:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.avaya.mediamanager.entity" />
    <property name="jpaVendorAdapter" ref="hbAdapterBean_pgsql"/>   
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.id.new_generator_mappings">true</prop>
        </props>
    </property>     
</bean>
<bean id="hbAdapterBean_pgsql" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">  
    <property name="showSql" value="false"></property>  
    <property name="generateDdl" value="true"></property>  
    <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect"></property>  
</bean>

如何从应用程序中更新列?

dxpyg8gm

dxpyg8gm1#

我同意@Schisme据我所知,更新类型或删除列是不可能的。您需要使用flyway,并创建一个迁移。
为了让事情变得更简单,您可以在mysql迁移中创建一个过程,如下所示:

DELIMITER $$
CREATE PROCEDURE change_column_type_if_exists(`@TABLE` VARCHAR(100), `@COLUMN` VARCHAR(100), `@NEW_TYPE` varchar(100) )
`DropColumnIfExists`: BEGIN
    DECLARE `@EXISTS` INT UNSIGNED DEFAULT 0;

    SELECT COUNT(*) INTO `@EXISTS`
    FROM `information_schema`.`columns`
    WHERE (
                      `TABLE_SCHEMA` = DATABASE()
                  AND `TABLE_NAME` = `@TABLE`
                  AND `COLUMN_NAME` = `@COLUMN`
              );

    IF (`@EXISTS` > 0) THEN
        SET @SQL = CONCAT('ALTER TABLE ', `@TABLE`, ' modify ', `@COLUMN`, ' ',`@NEW_TYPE`,' ;');
        PREPARE query FROM @SQL;
        EXECUTE query;
    END IF;
END $$
DELIMITER ;

然后,如果您需要修改某个列的类型,请运行以下命令:

CALL change_column_type_if_exists('audit', 'auditvalue', 'varchar(3000)');

CALL change_column_type_if_exists('audit', 'auditvalue', 'TEXT');

如果您发现任何更好的替代品,也请让我们知道,我们将不胜感激。

zrfyljdw

zrfyljdw2#

据我所知,将hibernate.hbm2ddl.auto设置为update实际上并不更新已经创建的表,而是在不删除数据的情况下添加新表。
您可以将hibernate.hbm2ddl.auto更改为create-drop,这将导致每次重新启动服务时重新创建您的模式,但我不确定这是否正是您想要的,因为它也将删除您的所有数据。
如果你想保留你的数据,你可能需要考虑使用像flyway这样的东西来填充它。
希望这个能帮上忙!玩得开心!

相关问题