Pregunta

¿Cuáles son algunas de las cosas que he observado en ColdFusion 9 con CF-ORM (Hibernate) que uno debe estar atento?

¿Fue útil?

Solución

    argumento
  • método entidad init() no debe haber requerido (s), de lo contrario EntityNew() y otras acciones CF-ORM rompa. Es posible que desee utilizar una fábrica para crear la entidad, y hacer cumplir los argumentos necesarios allí.

    Un error en relación a esta limitación ha sido presentada en el Adobe Bugbase.

  • ORMReload() con ormsettings.dbcreate = "drop create" podría dejar caer todas las tablas para usted. CF9 acumulativa Hot Fix 1 mejora esto un poco, pero puede que desee dejar caer las tablas de base de datos usted mismo.

  • type="date" (por defecto a usar ormtype="date"), será única fecha tienda, pero no el tiempo. Si desea persistió tiempo, así, utilizar ormtype="timestamp"

  • type="string" será por defecto varchar(255)

  • type="numeric" tome por defecto float, no int. Utilice ormtype = "int" si es necesario.

  • Si fieldtype="id" y el generador se encuentra en cierta generador, ormtype tomaría el valor int.

  • type="string" length="10" utilizará varchar(10), no char(10)

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

  • El uso type="boolean" tinyint por defecto, el uso sqltype="bit" si es necesario.

  • debería utilizar inverse=true en una relación bi-direccional, por lo general en "uno-a-muchos" lado.

  • hacer no inverse="true" uso en relación unidireccional! La relación no podría ser persistido en absoluto!

  • Si utiliza MS-SQL, no se puede tener más de 1 entidad con la propiedad de uno-a-uno NULL, porque nulo se considera como un valor único en un índice. Buena idea para hacer la columna no nula. (O uso 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. Utilice isNull() para comprobar antes de utilizar el valor devuelto.

  • ORMExecuteQuery volverá matriz vacía si no hay ninguna entidad se encuentra por defecto.

  • no se olvide de usar la propiedad singularname en "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á todas las propiedades lazy-carga. Alternativamente, usted puede tratar <cfdump var="#entityToQuery([entity])#"> o conjunto superior = 1 para volcar de manera eficiente.

  • entidad almacenada en el ámbito de la sesión se desconectará con su ámbito de sesión de Hibernate, y la propiedad de carga perezosa no se cargará. Para restaurar el ámbito de sesión de hibernación, utilice entityLoadByExample() o entitySave(entity).

  • cascade="all-delete-orphan" por lo general tiene más sentido para "uno-a-muchos" o una relación "muchos a muchos". Hibernate conjuntos nula a continuación, elimine, por lo que asegúrese de que la columna es anulable. Probar y ver si ese es su deseo comportamiento.

  • set 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 heredado puede romperse a veces debido a un error de Hibernate no fijado, utilice linktable como una solución.

  • structKeyColumn no puede ser la PK de la entidad de destino.

  • bidireccional muchos-a-muchos no pueden utilizar struct

  • Al añadir nueva entidad a struct, structKeyColumn CF se ignora cuando persiste la entidad matriz.

  • Si accede a la uno-a-muchos / muchos-a-muchos matriz o directamente struct, asegúrese de que existe la matriz correspondiente / struct antes de su uso. Generada ADDX () / HasX () / eliminarX () son seguros para usar en cualquier momento.

  • a postInsert(), la sesión de hibernación entidad ya no está disponible, por lo que establecer propiedad en postInsert () se ignoran en silencio, o sesión es será lanzada excepción cerrada.

  • después de entidad es cargado por entityLoad() o HQL de DB, los cambios se persistieron automáticamente incluso si EntitySave() no se llama.

  • transacción con CF-ORM se lleva a cabo de una manera que se inicia una nueva sesión y se cierran cuando se hace.

  • dentro del evento (es decir, de la precarga () / postInsert ()), asignando a las variables podría lanzar una excepción de Java acerca de los tipos. Utilice JavaCast () para evitar el error.

Actualizar

  • CF9.0.1 +:. <cfquery dbtype="hql"> uso, fácil de hacer cfqueryparam, y la salida de depuración en realidad le muestra los valores binded

Otros consejos

Add'l recomendaciones:

  • Desactivar ormsettings.flushAtRequestEnd = false para no tener el auto-vaciado al final de la solicitud. En su lugar utilice transacciones (a partir de CF9.01, cftransaction vuelca la sesión para que la finalización de la transacción) en torno a todas Escribir transacciones (EntitySave () o cuando se edita una entidad PERSISTED).
  • Evitar la inyección SQL utilizando parámetros binded en HQL - sin nombre '?' o el nombre ':' notaciones, para asegurar el tipo de unión por ORM contra el campo en cuestión (como cfqueryparam hace). Evitar la inyección de SQL!
  • CF9.0.1 permite CFQUERY dbtype = "HQL" para escribir y salida HQL en línea. Utilice cfqueryparam para unirse en línea params (equivalente a sin nombre? Anotación en HQL).
  • Uso LEFT OUTER JOIN FETCH en HQL a ir a buscar relaciones con ganas.
  • Override añadir / quitar funciones en CFC con las relaciones bidireccionales para asegurar ambos lados se establecen cuando cualquiera es.
  • Activar ormsettings.logsql = true para ver derivada de SQL en la consola. Ajustar la configuración de log4j Hibernate para ajustar aún más la configuración de registro de hibernación.
  • Unir Google Grupo cf-ORM-dev. gente brillante allí.

En conjunto con tocar el violín con la hibernación registro también puede activar "mantener conexiones" fuera de su fuente de datos.

Con SQL Server 2005 podrá abrir perfiles y ver las consultas que viene a través.

Desde mantener conexiones está fuera de hibernación se verán obligados a crear nuevas declaraciones preparadas cada vez.

Lectura prepara declaraciones puede ser difícil, pero al menos se puede ver las consultas primas que se están generando.

Si usted mantiene las conexiones de 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 proviene de.

EntityReload parece ignorar la carga diferida como cfdump.

Yo lo uso después de una EntitySave para agarrar cualquier columna en mora en el PP. Veo en el Analizador de SQL (una herramienta de rastreo para SQL Server) un montón de preguntas que vienen a través.

Si cambiarlo a un EntityLoadByPK, etc que se carga el objeto y no ver todo el exceso de consultas relación que para mí puede causar grandes problemas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top