/ / Liquibase + Hibernate rinominare la colonna - java, hibernate, jpa, liquibase, liquibase-hibernate

Liquibase + Hibernate rinominare la colonna - java, hibernate, jpa, liquibase, liquibase-hibernate

Utilizzo un database H2 per archiviare i miei dati e liquibase (con il plug-in di sospensione) per verificare le differenze tra database e projet.

supponiamo di avere il seguente codice:

@Entity
public class myEntity{

@Column(name="val")
private int value;

}

Il database è a posto e memorizza già alcuni dati.

Ora, quando rinominerò la colonna sopra, vale a dire da val a value ed eseguirò liquibase: diff, il difflog dice di eliminare la colonna "val" e aggiungere una colonna "value".

Ovviamente questo non è quello che volevo, perché tutti i dati originariamente memorizzati nella colonna "val" sarebbero andati.

C'è un modo per dire a Liquibase che non è una nuova colonna, ma una vecchia ribattezzata?

Voglio eseguire liquibase: diff e il diffLog generato dovrebbe contenere automaticamente il tag rename ... per la mia colonna, non un add .. e una goccia .. uno ..

risposte:

2 per risposta № 1

Hai provato ad usare un changeset come segue (o ho sbagliato la domanda)

   <changeSet author="liquibase-docs" id="renameColumn-example">
<renameColumn columnDataType="int"
newColumnName="value"
oldColumnName="val"
remarks="A change in names"
schemaName="public"
tableName="myEntity"/>
</changeSet>

0 per risposta № 2

Attualmente non esiste un modo per diffessere in grado di rilevare che il cambio di colonna era un rinominare piuttosto che un drop e creare. Questo è vero per qualsiasi sistema che crea modifiche usando diffs, non solo Liquibase.

Immagina te stesso come liquibase - ti vengono dati duetabelle che si trovano negli stati che descrivi. Come stabiliresti che una colonna è stata rinominata rispetto a una colonna caduta e l'altra colonna creata? L'unica cosa che posso pensare è che avrebbe bisogno di guardare il contenuto delle colonne e vedere che erano "per lo più"stesso. "In questo caso particolare, questo è impossibile perché i database che vengono confrontati includono uno che viene popolato con i dati e un secondo che è solo un database vuoto in memoria creato da Hibernate.