Talvez eu tenha entendido errado, mas eu acho que o JPA foi capaz de atualizar uma tabela existente (modelo alterado adicionando uma coluna), mas não está funcionando no meu caso.
Eu posso ver nos logs eclipselink tentando criá-lo, mas não porque já existe. Em vez de tentar uma atualização para adicionar a coluna continua.
E aqui está a tabela com a mudança (coluna online adicionada)
[EL Warning]: 2010-05-31 14: 39: 06.044 - ServerSession (16053322) - Exceção [EclipseLink-4002] (Eclipse Persistence Services - 2.1.0.v20100517-r7246): org.eclipse.persistence.exceptions .DatabaseException Exceção Interna: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: A tabela 'account' já existe Código de erro: 1050 Chamada: Conta CREATE TABLE (ID INTEGER NOT NULL, USERNAME VARCHAR (32) NOT NULL, SECURITY_KEY VARCHAR (255) NOT NULL, EMAIL VARCHAR (64) NOT NULL, STATUS VARCHAR (8) NOT NULL, TIMEDATE DATETIME NÃO NULL, PASSWORD VARCHAR (255) NOT NULL, ONLINE TINYINT (1) padrão 0 NOT NULL, PRIMARY KEY (ID)) Consulta: DataModifyQuery (sql = "Conta CREATE TABLE (ID INTEGER NOT NULL, USERNAME VARCHAR (32) NOT NULL, SECURITY_KEY VARCHAR (255) NOT NULL, E-MAIL VARCHAR (64) NOT NULL, STATUS VARCHAR (8) NULL, TIMEDATE DATETIME NOT NULL, PASSWORD VARCHAR (255) NÃO NULL, ONLINE TINYINT (1) padrão 0 NOT NULL, PRIMARY KEY (ID)) ") [EL Warning]: 2010-05-31 14: 39: 06.074 - ServerSession (16053322) - Exceção [EclipseLink-4002] (Eclipse Persistence Services - 2.1.0.v20100517-r7246): org.eclipse.persistence.exceptions .DatabaseException
Depois disso, continua com o seguinte.
Estou fazendo algo errado ou é um bug?
A partir do EclipseLink 2.4, você pode usar isso na especificação de sua unidade de persistência:
Esse é o comportamento esperado ao usar o valor create-tables
. Da documentação sobre a propriedade eclipselink.ddl-generation
:
Usando as Extensões EclipseLink JPA para Geração de Esquema
A seguir estão os valores válidos para o uso em um arquivo
persistence.xml
:
none
– o EclipseLink não gera DDL; Nenhum esquema é gerado.create-tables
– O EclipseLink tentará executar umCREATE TABLE
SQL para cada tabela. Se a tabela já existir, o EclipseLink seguirá o comportamento padrão de seu database específico e a combinação do driver JDBC (quando um SQLCREATE TABLE
for emitido para uma tabela já existente). Na maioria dos casos, uma exceção é lançada e a tabela não é criada. O EclipseLink continuará com a próxima instrução. (Veja tambémeclipselink.create-ddl-jdbc-file-name
.)drop-and-create-tables
– O EclipseLink tentaráDROP
todas as tabelas, em seguida,CREATE
all tables. Se algum problema for encontrado, o EclipseLink seguirá o comportamento padrão da combinação específica do database e do driver JDBC e continuará com a próxima instrução. (Veja tambémeclipselink.create-ddl-jdbc-file-name
eeclipselink.drop-ddl-jdbc-file-name
.)
Então você pode querer drop-and-create-tables
vez disso.
A implementação do Hibernate JPA faz exatamente o que você deseja. Aqui está a propriedade que permite esse comportamento:
property name="hibernate.hbm2ddl.auto" value="update"
create-or-extend-tables faz o truque