2010-03-19 8 views

Respuesta

49
  • método entidad init() no debe haber requerido argumento (s), de lo contrario EntityNew() 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() con ormsettings.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 usar ormtype="date"), solo almacenará la fecha, pero no la hora. Si desea persistido tiempo, así, utilizar ormtype="timestamp"

  • type="string" tomaría el valor varchar(255)

  • type="numeric" tome por defecto float, no int. 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), no char(10)

  • ormtype="char" length="10" utilizará char(1) todavía. Use sqltype="char(10)" si realmente lo necesita.

  • type="boolean" use tinyint de forma predeterminada, use sqltype="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, pero EntityLoadByPK("entity", 1) es más limpio!

  • EntityLoad(), EntityLoadByPK() y ORMExecuteQuery con unique=true, volverá null si no se encuentra entidad. Use isNull() 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 ejemplo addDog(Dog dog) vs addDogs(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() o entitySave(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" siempre notnull="true", más legible para los demás navegando a la CFC CFCExplorer

  • EntityNew('Y') es ligeramente más eficiente que new 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 invoque EntitySave().

  • 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 hacer cfqueryparam, y la salida de depuración en realidad le muestra los valores binded.
+4

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. –

+0

Brillante respuesta, un montón de información útil aquí – namtax

+0

Muchas gracias por esta gran cantidad de información sobre ORM de ColdFusion. Este tipo de información detallada debe haber sido duramente ganada. –

1

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.

7

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í.
2

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.

Cuestiones relacionadas