Pergunta

Quais são algumas das coisas que você já observado no ColdFusion 9 com CF-ORM (Hibernate) que se deve prestar atenção?

Foi útil?

Solução

  • entidade init() o método não deve ter argumento obrigatório(s), caso contrário, EntityNew() e outros CF-ORM ações que vão quebrar.Você pode querer usar uma Fábrica para criar a entidade, e fazer valer os argumentos necessários lá.

    Um erro em relação a esta limitação tem sido arquivado no Adobe Bugbase.

  • ORMReload() com ormsettings.dbcreate = "drop create" não pode soltar todas as tabelas para você. CF9 Cumulativa Hot Fix 1 melhora um pouco isso, mas você pode querer largar as tabelas no banco de si mesmo.

  • type="date" (padrão para usar ormtype="date"), irá armazenar apenas a data, mas não o tempo.Se você deseja persistentes tempo, bem como, utilizar ormtype="timestamp"

  • type="string" será o padrão para varchar(255)

  • type="numeric" será o padrão para float, não int.Use ormtype="int", se necessário.

  • se fieldtype="id" e gerador é definido para alguns gerador, ormtype padrão será int.

  • type="string" length="10" vai usar varchar(10), não char(10)

  • ormtype="char" length="10" vai usar char(1) ainda.Utilização sqltype="char(10)" se o que você realmente precisa.

  • type="boolean" utilização tinyint por padrão, use o sqltype="bit" se você precisa.

  • deve usar inverse=true em uma relação bidirecional, geralmente em "um-para-muitos".

  • fazer NÃO utilização inverse="true" na uni-direcional relacionamento!O relacionamento não pode ser persistente em tudo!

  • Se você usar o MS-SQL, você não pode ter mais do que 1 entidade com um-para-um conjunto de propriedades para Null porque Null é considerado como um único valor em um índice.Boa idéia fazer com que a coluna não nula.(ou use linktable)

  • EntityLoad("entity", 1, true) funciona, mas EntityLoadByPK("entity", 1) é mais limpo!

  • EntityLoad(), EntityLoadByPK(), e ORMExecuteQuery com unique=true, vai voltar null se a entidade não for encontrado.Utilização isNull() para verificar antes de utilizar o valor retornado.

  • ORMExecuteQuery retornará uma matriz vazia se não houver entidade é encontrado por padrão.

  • não se esqueça de usar singularname propriedade de "um-para-muitos" / "muitos-para-muitos" para o melhor olhando gerado funções (e.g. addDog(Dog dog) vs addDogs(Dog dogs) .)

  • <cfdump> irá carregar todas as lazy-load propriedades.Alternativamente, você pode tentar <cfdump var="#entityToQuery([entity])#"> ou set-top=1 para despejo de forma eficiente.

  • entidade armazenados no escopo de Sessão será desconectada com a sua session do Hibernate escopo e carga lenta propriedade não será carregado.Para restaurar a sessão do hibernate escopo, use entityLoadByExample() ou entitySave(entity).

  • cascade="all-delete-orphan" normalmente fazem mais sentido para o "um-para-muitos" ou "muitos-para-muitos" da relação.O Hibernate define null, em seguida, excluir, portanto, certifique-se de que a coluna é anulável.Teste e veja se esse é o seu desejo de comportamento.

  • conjunto required="true" sempre notnull="true", e mais legível para os outros a navegação do CFC, com CFCExplorer

  • EntityNew('Y') é um pouco mais eficiente do que new com.X.Y se a entidade é ser persistente, mais tarde, de acordo com alguns Adobe engenheiro.

  • relação com uma herdadas entidade pode quebrar-se, por vezes, devido a um unfixed Hibernate bug, use linktable como uma solução alternativa.

  • structKeyColumn não pode ser o PK da entidade de destino.

  • bi-direcional de muitos-para-muitos, não é possível usar struct

  • Quando a adição de nova entidade para estrutura, structKeyColumn é ignorada quando a CF persistir a entidade-mãe.

  • Se você acessar o um-para-muitos / muitos-para-muitos matriz ou estrutura diretamente, certifique-se de que a matriz correspondente/struct existe antes de usar.Gerado addX()/hasX()/removeX() são seguros para usar a qualquer momento.

  • no postInsert(), a entidade session do hibernate não está mais disponível, portanto, a definição de propriedade em postInsert() serão ignorar silenciosamente, ou do encerramento da Sessão exceção será lançada.

  • depois de entidade é carregado por entityLoad() ou HQL do banco de dados, as alterações serão automaticamente persiste mesmo se EntitySave() não é chamado.

  • transação com CF-ORM é implementado de uma maneira que ele inicia uma nova sessão e fechar quando terminar.

  • dentro do evento (por exemplo,pré-carga() / postInsert()), atribuindo às variáveis pode lançar exceção Java sobre tipos.Use JavaCast() para solucionar o erro.

ATUALIZAÇÃO

  • CF9.0.1+:utilização <cfquery dbtype="hql">, fácil de fazer cfqueryparam, e a saída de depuração de verdade, mostra a obrigar valores.

Outras dicas

Adicionar recomendações:

  • Desligue o ormsettings.flushatRequendEnd = Falso para não ter um fluxo automático no final da solicitação. Em vez disso, use transações (a partir de CF9.01, CFTransaction libera sessão para sua conclusão de transações) em torno de todas as transações de gravação (entitySave () ou quando você edita uma entidade persistida).
  • Evite a injeção de SQL usando parâmetros binted em HQL - sem nome '?' ou chamado ':' Notações, para garantir a ligação do tipo por ORM contra o campo em questão (como o CFQUERYPARAM faz). Evite a injeção de SQL!
  • CF9.0.1 permite que o CFQUERY DBTYPE = "HQL" escreva e saia em linha HQL. Use CfQueryParam para ligar os parâmetros em linha (equivalente à notação sem nome?
  • Use a junção externa esquerda Fetch no HQL para buscar relacionamentos ansiosos.
  • Substitua Adicionar/Remover funções nos CFCs com relações bidirecionais para garantir que ambos os lados sejam definidos quando ambos são.
  • Turn ormsettings.logsql = true para visualizar o SQL derivado no console. Ajuste as configurações do LOG4J Hibernate para ajustar ainda mais as configurações de log do Hibernate.
  • Junte-se ao Google Group CF-Aorm-Dev. Pessoas brilhantes lá.

Em conjunto com a brincadeira com o log de hibernato, você também pode desativar "manter as conexões" para o seu painel de dados.

Com o SQL Server 2005, você pode iniciar o Profiler e assistir às consultas chegando.

Como a manutenção de conexões está fora do Hibernate será forçada a criar novas declarações preparadas a cada vez.

A leitura de declarações preparadas pode ser difícil, mas pelo menos você pode ver as consultas brutas que estão sendo geradas.

Se você manter conexões, essas declarações preparadas são criadas uma vez e você apenas verá algo como

sp_execute 15, 'algumparam'

Antes que isso fosse executado, o SP_Prepexec foi executado, de onde vem os 15.

EntityReload parece ignorar o carregamento preguiçoso como o cfdump.

Eu o uso após um entitySave para pegar todas as colunas padrão no banco de dados. Vejo no SQL Profiler (uma ferramenta de rastreamento para o SQL Server), muitas consultas chegando.

Se alterá -lo para um entityloadbypk, etc, ele carregará o objeto e não verá todas as consultas de relacionamento em excesso que para mim podem causar grandes problemas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top