¿Cuáles son algunas de las cosas que ha observado en ColdFusion 9 con CF-ORM (Hibernate) que debe tener en cuenta?Aspectos a tener en cuenta en ColdFusion 9 con CF-ORM
Respuesta
método entidad
init()
no debe haber requerido argumento (s), de lo contrarioEntityNew()
y otras acciones CF-ORM se romperá. Es posible que desee utilizar una Fábrica para crear la entidad y aplicar los argumentos requeridos allí.A bug regarding this limitation has been filed in the Adobe Bugbase.
ORMReload()
conormsettings.dbcreate = "drop create"
podría dejar caer todas las tablas para usted. CF9 Cumulative Hot Fix 1 mejora esto un poco, pero es posible que desee dejar caer las tablas en DB usted mismo.type="date"
(predeterminado para usarormtype="date"
), solo almacenará la fecha, pero no la hora. Si desea persistido tiempo, así, utilizarormtype="timestamp"
type="string"
tomaría el valorvarchar(255)
type="numeric"
tome por defectofloat
, noint
. Use ormtype = "int" si es necesario.si
fieldtype="id"
y el generador está configurado en algún generador, orm tipo por defecto seráint
.type="string" length="10"
utilizarávarchar(10)
, nochar(10)
ormtype="char" length="10"
utilizaráchar(1)
todavía. Usesqltype="char(10)"
si realmente lo necesita.type="boolean"
usetinyint
de forma predeterminada, usesqltype="bit"
si lo necesita.debe usar
inverse=true
en una relación bidireccional, generalmente en el lado "uno a muchos".do NO uso
inverse="true"
en una relación unidireccional! ¡Es posible que la relación no se mantenga para nada!Si usa MS-SQL, no puede tener más de 1 entidad con propiedad de uno a uno establecida en Nulo, porque Nulo se considera como un valor único en un índice. Buena idea hacer que la columna no sea nula. (o use linktable)
EntityLoad("entity", 1, true)
funciona, peroEntityLoadByPK("entity", 1)
es más limpio!EntityLoad()
,EntityLoadByPK()
yORMExecuteQuery
conunique=true
, volveránull
si no se encuentra entidad. UseisNull()
para verificar antes de usar el valor devuelto.ORMExecuteQuery
devolverá la matriz vacía si no se encuentra ninguna entidad de forma predeterminada.no se olvide de utilizar
singularname
propiedad de "uno a muchos"/"muchos-a-muchos" buscan para las funciones más agradables generados (por ejemploaddDog(Dog dog)
vsaddDogs(Dog dogs)
.)<cfdump>
cargará todos las propiedades de carga diferida Alternativamente, puede probar<cfdump var="#entityToQuery([entity])#">
o configurar top = 1 para que se descargue de manera eficiente.entidad almacenada en el ámbito de la sesión se desconectará con su alcance de sesión de Hibernate y la propiedad de carga lenta no se cargará. Para restaurar el alcance de la sesión de hibernación, use
entityLoadByExample()
oentitySave(entity)
.cascade="all-delete-orphan"
generalmente tienen más sentido para la relación "uno a muchos" o "muchos a muchos". Hibernate establece null y luego elimina, así que asegúrese de que la columna sea nulable. Pruebe y vea si ese es su deseo de comportamiento.conjunto
required="true"
siemprenotnull="true"
, más legible para los demás navegando a la CFC CFCExplorerEntityNew('Y')
es ligeramente más eficiente quenew com.X.Y
si la entidad debe ser persistido más adelante de acuerdo con algún ingeniero de Adobe.relación con una entidad heredada puede romperse a veces debido a un error de Hibernate sin corregir, use
linktable
como una solución.structKeyColumn
no puede ser el PK de la entidad de destino.bidireccional muchos-a-muchos no pueden utilizar struct
Al añadir nueva entidad a struct,
structKeyColumn
se omite al CF persiste la entidad matriz.Si accede directamente a la matriz uno-a-muchos/muchos-a-muchos o struct, asegúrese de que la matriz/estructura correspondiente exista antes de su uso. Generado addX()/hasX()/removeX() son seguros de usar en cualquier momento.
en
postInsert()
, la sesión entidad hibernate ya no está disponible, por lo que la propiedad de configuración en postInsert() se ignorará silenciosamente o se lanzará la excepción de sesión cerrada.Después de que la entidad se cargue por
entityLoad()
o HQL desde la base de datos, los cambios se mantendrán automáticamente aunque no se invoqueEntitySave()
.transacción con CF-ORM se implementa de forma que se inicia una nueva sesión y se cierra cuando está hecho.
dentro del evento (es decir, preLoad()/postInsert()), la asignación de variables puede arrojar una excepción de Java sobre los tipos. Use JavaCast() para evitar el error.
ACTUALIZACIÓN
- CF9.0.1 +:
<cfquery dbtype="hql">
usar, fácil de hacercfqueryparam
, y la salida de depuración en realidad le muestra los valores binded.
Parece que EntityReload ignora la carga diferida como CFDUMP.
Lo uso después de un EntitySave para agarrar cualquier columna predeterminada en la base de datos. Veo en SQL Profiler (una herramienta de seguimiento para SQL Server) un montón de consultas que pasan.
Si lo cambia a un EntityLoadByPK, etc. cargará el objeto y no verá todas las consultas de relaciones excesivas que para mí pueden causar problemas importantes.
recomendaciones Add'l:
- apague ormsettings.flushAtRequestEnd = false para no tener el auto-vaciado al final de la solicitud. En su lugar, use las transacciones (a partir de CF9.01, cftransaction vacía la sesión para completar la transacción) en todas las transacciones de escritura (entitySave() o cuando edita una entidad persistente).
- Prevenir la inyección de SQL mediante el uso de parámetros vinculados en HQL - sin nombre '?' o anotaciones ':' con nombre, para asegurar el enlace de tipo por ORM contra el campo en cuestión (como lo hace CFQUERYPARAM). ¡Prevenga la inyección de SQL!
- CF9.0.1 permite que CFQUERY dbtype = "hql" escriba & HQL de salida en línea. Utilice CFQUERYPARAM para enlazar params en línea (equivalente a notación? Sin nombre en HQL).
- Use LEFT OUTER JOIN FETCH en HQL para obtener relaciones de búsqueda ansiosas.
- Anular funciones de agregar/quitar en CFC con relaciones bidireccionales para garantizar que ambos lados estén configurados cuando cualquiera de los dos sea.
- Gire ormsettings.logsql = true para ver el SQL derivado en la consola. Ajuste la configuración de hibernación de log4j para modificar aún más la configuración de registro de Hibernate.
- Únete a Google Group cf-orm-dev. Gente brillante allí.
Junto con tocar el registro de Hibernate también puede desactivar "mantener conexiones" para su fuente de datos.
Con SQL Server 2005 puede iniciar el generador de perfiles y ver las consultas entrantes.
Como mantener las conexiones desactivadas, Hibernate se verá obligado a crear nuevas declaraciones preparadas cada vez.
Leer declaraciones preparadas puede ser difícil, pero al menos puede ver las consultas sin procesar que se están generando.
si se mantienen las conexiones estas declaraciones preparadas se crean una vez y que acaba de ver algo como
sp_execute 15, 'someparam'
Antes de que esto se corrió sp_prepexec se corrió que es donde el 15 viene.
- 1. Aspectos a tener en cuenta al crear un marco
- 2. Coldfusion: archivo .cfm no encontrado cuando existe en el servidor
- 3. Migración de ColdFusion MX7 a ColdFusion 9. ¿Algún problema?
- 4. ¿Qué debo hacer una copia de seguridad en ColdFusion 9?
- 5. Diferencias entre ASP.Net framework 1.xy 3.5/sitios web y aplicaciones web. Aspectos a tener en cuenta durante una migración
- 6. Problema de instalación de Coldfusion 9 con IIS7
- 7. ¿Puedo instalar ColdFusion 9 y ColdFusion 8 en el mismo servidor?
- 8. Programación orientada a aspectos en android
- 9. Programación orientada a aspectos en Java
- 10. ¿Cómo acceder a un alcance de aplicación desde una aplicación separada en ColdFusion 9?
- 11. Programación orientada a aspectos en C#
- 12. Programación orientada a aspectos en Clojure
- 13. Conexión a neo4j con ColdFusion
- 14. Lista de etiquetas no disponible Sintaxis del script ColdFusion 9?
- 15. ¿Por dónde empiezo con la Programación Orientada a Aspectos?
- 16. Aspectos múltiples en un método
- 17. Advertencias a tener en cuenta en la transición de Sun JVM a JRockit?
- 18. número al azar de -9 a 9 en C++
- 19. ¿Qué prácticas de codificación OOP siempre debe tener en cuenta?
- 20. Comparación de cadenas para tener en cuenta los números
- 21. ¿Cambiar a ColdFusion?
- 22. expresión NSDictionaryResultType no tener en cuenta los nuevos objetos insertados
- 23. ¿Ordenar objetos datetime sin tener en cuenta el año?
- 24. ¿Cómo puedo usar Verity para indexar y buscar contenido de base de datos en ColdFusion 9?
- 25. ¿Qué pasó con la Programación Orientada a Aspectos?
- 26. Registro Orientado a Aspectos con Unity \ T4 \ cualquier cosa
- 27. Aspectos técnicos de OpenGl VBO en C++
- 28. ¿Los aspectos sustituyen a los repositorios?
- 29. cfqueryparam con el operador like en ColdFusion
- 30. ColdFusion 9 llamando al servicio web .NET: no se puede encontrar el funcionamiento del servicio web con parámetros. ¡AYUDA!
Prefiero EntityLoadByPk también, pero no diría que es mejor. Simplemente es más apropiado cargar una sola instancia por PK. También agregaría que no debe (normalmente) almacenar una entidad un alcance persistente. Las personas pueden tener la tentación de, por ejemplo, almacenar una entidad de usuario en el ámbito de la sesión. Sin embargo, esto puede generar problemas con la separación de la entidad de Hibernate. –
Brillante respuesta, un montón de información útil aquí – namtax
Muchas gracias por esta gran cantidad de información sobre ORM de ColdFusion. Este tipo de información detallada debe haber sido duramente ganada. –