[RESOLVIDO]JPA + Hibernate com hbm2ddl ativado nao gera algumas tabelas

17 respostas
F

Estou tentando fazer a minha aplicação com JPA e Hibernate gerarem as tabelas no banco de dados pelas anotações nas classes, mas o estranho é algumas tabelas e foreign keys nao serem geradas, por exemplo tenho a seguinte classe

Usuario
public class Usuario implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "idfuncionario")
    @GeneratedValue(generator = "foreign")
    @GenericGenerator(name = "foreign", strategy = "foreign",
    parameters = {
        @Parameter(name = "property", value = "funcionario")})
    private Integer idFuncionario;
    @Column(name = "login", length = 20)
    private String login;
    @Column(name = "senha", length = [telefone removido])
    private String senha;
    @JoinColumn(name = "idtipousuario", referencedColumnName = "id")
    @ManyToOne(fetch = FetchType.LAZY)
    private TipoUsuario tipoUsuario;
    @JoinColumn(name = "idfuncionario", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
    @OneToOne(optional = false, fetch = FetchType.LAZY)
    private Funcionario funcionario;
Funcionario
public class Funcionario implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id", nullable = false)
    private Integer id;
    @Column(name = "nome", length = 200)
    private String nome;
    @Column(name = "logradouro", length = 200)
    private String logradouro;
    @Column(name = "numero", length = 50)
    private String numero;
    @Column(name = "complemento", length = 50)
    private String complemento;
    @Column(name = "bairro", length = 100)
    private String bairro;
    @Column(name = "cidade", length = 100)
    private String cidade;
    @Column(name = "cep", length = 8)
    private String cep;
    @Column(name = "uf", length = 2)
    private String uf;
    @Column(name = "telefone", length = 20)
    private String telefone;
    @Column(name = "celular", length = 20)
    private String celular;
    @Column(name = "cpf", length = 11)
    private String cpf;
    @Column(name = "rg", length = 8)
    private String rg;
    @Column(name = "orgaorg", length = 5)
    private String orgaoRg;
    @Basic(optional = false)
    @Column(name = "tipologradouro", length = 100)
    private String tipoLogradouro;
    @Column(name = "observacao", length = [telefone removido])
    private String observacao;
    @Column(name = "ativo")
    private Boolean ativo;
    @Column(name = "datanasc")
    @Temporal(TemporalType.DATE)
    private Date dataNasc;
    @Column(name = "estadocivil", length = 40)
    private String estadoCivil;
    @Column(name = "sexo", length = 40)
    private String sexo;
    @Column(name = "datacad")
    @Temporal(TemporalType.DATE)
    private Date dataCad;
    @Column(name = "email")
    private String email;
    @Column(name = "pais")
    private String pais;
    @Column(name = "supervisor", nullable = false)
    private Boolean supervisor;
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "funcionario", fetch = FetchType.EAGER)
    private Usuario usuario;

ao executar o sistema ele nao gerou nem a tabela Usuario nem a tabela Funcionario por que?

17 Respostas

H

Vc anotou suas classes com @Entity?

F

todas com
@Entity
@Table(name = “funcionario”, schema = “erp”)

D

Algum erro no log?
Eventualmente, pode haver problemas com os relacionamentos mapeados ou com os atributos das classes que não geraram tables.
Por que não tenta fazer algo com o SchemaExport para ver o resultado?

H

drsmachado:
Algum erro no log?
Eventualmente, pode haver problemas com os relacionamentos mapeados ou com os atributos das classes que não geraram tables.
Por que não tenta fazer algo com o SchemaExport para ver o resultado?

Além do sugerido.

Existem tabelas que são criadas e outras não?

F

entao quanto ao log nao disparou nenhum erro, tanto que se eu tenho o banco ja criado a aplicação funciona perfeitamente com as tabelas usuario e Funcionario.

O SchemaExport nao seria a mesma coisa de ativar o hbm2ddl para create?

Eu preciso que fique em auto para cada alteração nas classes ele dispare para as tabelas no bd atualizando assim a estrutura

F

Isso ele criou quase todas as tabelas por exemplo de 200 tabelas nao criou 10 tabelas um exemplo sao essas 2 Usuario e Fornecedor que tem um relacionamento OneToOne

D

furacao123:
Isso ele criou quase todas as tabelas por exemplo de 200 tabelas nao criou 10 tabelas um exemplo sao essas 2 Usuario e Fornecedor que tem um relacionamento OneToOne

Justamente o ponto onde eu acredito estar havendo erro.
O hibernate, quando está com a opção hbm2ddl.auto ativada (update ou create) não “loga” os erros, mas, caso haja algo que não seja possível construir, ele simplesmente toca em frente, sem avisar.
Assim sendo, sugeri o SchemaExport para forçar a saída no console, meio pelo qual você pode conferir se os bancos foram ou não gerados com sucesso.
Aliás, não é a mesma coisa.
O SchemaExport irá utilizar um mecanismo próprio, que gerará o script e pode não ser executado (lembre-se ele recebe 2 booleans como parâmetro, script e export), caso o segundo seja false, ele não afeta o banco (na teoria).
Sem ver o que o hibernate tenta fazer, fica impossível dizer a causa, mas, por experiência própria, te garanto ser problema com a geração das tabelas, algum erro, coisa assim.

F

é bem provavel entao que eles esta passando sem disparar o erro, eu uso anotações nas classes, tenho como utilizar o SchemaExport utilizando o persistence.xml?

Vou dar uma procurada aqui em exemplos que fiz a um tempo usando o SchemaExport, que ja nao lembro mais :slight_smile:

F

executei pelo SchemaExport, verifiquei na saida os create tables

create table erp.funcionario (
        id  serial not null,
        ativo bool,
        bairro varchar(100),
        celular varchar(20),
        cep varchar(8),
        cidade varchar(100),
        complemento varchar(50),
        cpf varchar(11),
        datacad date,
        datanasc date,
        email varchar(255),
        estadocivil varchar(40),
        logradouro varchar(200),
        nome varchar(200),
        numero varchar(50),
        observacao varchar[telefone removido]),
        orgaorg varchar(5),
        pais varchar(255),
        rg varchar(8),
        sexo varchar(40),
        supervisor bool not null,
        telefone varchar(20),
        tipologradouro varchar(100) not null,
        uf varchar(2),
        idfuncionariotipo int4 not null,
        primary key (id)
    )

executou tudo nao deu nenhum erro, mas nao criou a tabela no BD, ja a tabela usuario, e algumas outras que tambem nao havia sido criadas foram criadas, segue o meu arquivo hibernate.cfg.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE hibernate-configuration PUBLIC  
"-//Hibernate/Hibernate Configuration DTD//EN"  
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
<hibernate-configuration>  
    <session-factory>  
          
        <property name="hibernate.connection.driver_mapping">org.postgresql.Driver</property>  
        <property name="hibernate.connection.url">jdbc:postgresql://192.168.0.200/web_start</property>  
        <property name="hibernate.connection.username">postgres</property>  
        <property name="hibernate.connection.password">123</property>  
        <property name="hibernate.show_sql">true</property>  
        <property name="hibernate.format_sql">true</property>  
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>  

         <!--Todas as classes mapping-->

         </session-factory>  
         </hibernate-configuration>

e minha classe que chama o SchemaExport

try {

            AnnotationConfiguration cfg = new AnnotationConfiguration();
            cfg.configure();
            SchemaExport schema = new SchemaExport(cfg);
            schema.create(true, true);

        } catch (Exception e) {
            e.printStackTrace();
        }
D

furacao123:
executei pelo SchemaExport, verifiquei na saida os create tables

create table erp.funcionario ( id serial not null, ativo bool, bairro varchar(100), celular varchar(20), cep varchar(8), cidade varchar(100), complemento varchar(50), cpf varchar(11), datacad date, datanasc date, email varchar(255), estadocivil varchar(40), logradouro varchar(200), nome varchar(200), numero varchar(50), observacao varchar[telefone removido]), orgaorg varchar(5), pais varchar(255), rg varchar(8), sexo varchar(40), supervisor bool not null, telefone varchar(20), tipologradouro varchar(100) not null, uf varchar(2), idfuncionariotipo int4 not null, primary key (id) )

Perceba que o hibernate usou observacao varchar[telefone removido]),
Segundo http://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html http://forums.mysql.com/read.php?98,37000,37052 o limite para varchar é bem menor que o indicado ali, que obedece tua configuração. Sugiro incluir, na annotation, o atributo columnDefinition=“text”

Outra coisa, caso tenha sido CTRL + C / CTRL + V, não existe, no mysql, um tipo de dado int4 idfuncionariotipo int4 not null, sem contar que você não nomeou nenhum atributo com a identificação idfuncionariotipo.

F

Estou utilizando postgres, realmente esqueci de colocar o @Lob no atributo text, vou fazer as alterações e testar vlw

F

putz era isso mesmo, coloquei o @Lob ele criou o campo observacao como text e gerou a tabela sem problemas, mas nao tem uma forma de verificar se deu algum erro na criação dessas tabelas?

D

Utilizando hbm2ddl.auto, eu desconheço.
A saída ignora por completo toda e qualquer configuração de log, por alguma razão obscura.
De fato, a única forma que conheço é esta que passei.
Tive problemas com a geração de algumas tabelas no mysql, mas por coisas diferentes, porém, o resultado era o mesmo, de 100, apenas 2 não gerava.
Fiquei com aquilo na cabeça, poderia ter gerado as mesmas na mão, mas não era o que eu queria.
Fui mexendo até achar a causa do problema.

R

Com relação ao logging do hbm2ddl, vocês chegaram a adicionar no log4j o nível DEBUG nessa categoria?

org.hibernate.tool.hbm2ddl

Caso tenham dúvidas do que exatamente fazer o loggin, você pode encontrar na documentação do Hibernate:

http://docs.jboss.org/hibernate/core/3.5/reference/en-US/html/session-configuration.html#configuration-logging

Espero ter ajudado

F

Eu utilizo o log4j da seguinte maneira

log4j.appender.LOG=org.apache.log4j.RollingFileAppender
log4j.appender.LOG.layout=org.apache.log4j.PatternLayout
log4j.appender.LOG.layout.ConversionPattern=%-5p %d{dd/MM/yyyy HH:mm:ss}  [%t]   %-50c:%L - %m%n
log4j.appender.LOG.MaxFileSize=5MB
log4j.appender.LOG.MaxBackupIndex=10
# Frameworks -------------------------------------------------
log4j.logger.org.hibernate=debug, HIBERNATE

# Frameworks Appender ----------------------------------------
log4j.appender.HIBERNATE=org.apache.log4j.RollingFileAppender
log4j.appender.HIBERNATE.layout=org.apache.log4j.PatternLayout
log4j.appender.HIBERNATE.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss} %-5p (%c):%L - %m%n
log4j.appender.HIBERNATE.MaxFileSize=5MB
log4j.appender.HIBERNATE.MaxBackupIndex=10


log4j.rootLogger= DEBUG, LOG

E esse log nao retornou nada de erro, soh os sqls executados

F

Opa agora sim no arquivo de log identifiquei os erros na criação, adicionei a seguinte linha no meu log4j

# Log all SQL DDL statements as they are executed log4j.logger.org.hibernate.tool.hbm2ddl=debug

e no meu arquivo

29/02/2012 12:02:15 ERROR (org.hibernate.tool.hbm2ddl.SchemaExport):274 - Unsuccessful: create table erp.usuario (idfuncionario int4 not null, login varchar(20), senha varchar[telefone removido]), idtipousuario int4, primary key (idfuncionario)) 29/02/2012 12:02:15 ERROR (org.hibernate.tool.hbm2ddl.SchemaExport):275 - ERRO: tamanho para tipo varchar não pode exceder 10485760

agora identifiquei a falha

vlw

D

É, este detalhe eu não cheguei a analisar nos meus testes.
De qualquer maneira, valeu pela disposição de vir e informar onde o erro ocorreu.

Criado 28 de fevereiro de 2012
Ultima resposta 29 de fev. de 2012
Respostas 17
Participantes 4