Coisas a se observar no ColdFusion 9 com CF-ORM
-
21-09-2019 - |
Pergunta
Quais são algumas das coisas que você já observado no ColdFusion 9 com CF-ORM (Hibernate) que se deve prestar atenção?
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()
comormsettings.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 usarormtype="date"
), irá armazenar apenas a data, mas não o tempo.Se você deseja persistentes tempo, bem como, utilizarormtype="timestamp"
type="string"
será o padrão paravarchar(255)
type="numeric"
será o padrão parafloat
, nãoint
.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 usarvarchar(10)
, nãochar(10)
ormtype="char" length="10"
vai usarchar(1)
ainda.Utilizaçãosqltype="char(10)"
se o que você realmente precisa.type="boolean"
utilizaçãotinyint
por padrão, use osqltype="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, masEntityLoadByPK("entity", 1)
é mais limpo!EntityLoad()
,EntityLoadByPK()
, eORMExecuteQuery
comunique=true
, vai voltarnull
se a entidade não for encontrado.UtilizaçãoisNull()
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)
vsaddDogs(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()
ouentitySave(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"
semprenotnull="true"
, e mais legível para os outros a navegação do CFC, com CFCExplorerEntityNew('Y')
é um pouco mais eficiente do quenew 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 seEntitySave()
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 fazercfqueryparam
, 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.