nhibernate - todos - lista en hibernate
NHibernate HiLo ID Generator. Generando una ID antes de guardar (1)
Estoy intentando usar la propiedad ''adonet.batch_size'' en NHibernate. Ahora, estoy creando entidades en varias sesiones a una gran velocidad (por lo tanto, la inserción de lotes). Entonces, lo que estoy haciendo es crear un búfer donde guardo estas entidades y las eliminen de una vez periódicamente.
Sin embargo, necesito los ID tan pronto como creo las entidades. Entonces quiero crear una entidad (en cualquier sesión) y luego generar su ID (estoy usando el generador de HiLo). Y luego, en un momento posterior (y en otra sesión) quiero vaciar ese búfer y asegurarme de que esos ID no cambien.
¿Hay alguna forma de hacer esto?
Gracias
Guido
Me parece extraño que necesite muchas sesiones para hacer un solo trabajo. Normalmente, una sola sesión es suficiente para hacer todo el trabajo.
Dicho esto, el generador Hilo establece la propiedad id en la entidad al llamar a nhSession.Save(object)
sin que necesariamente exija un viaje de ida y vuelta a la base de datos y un nhSession.Flush()
las inserciones en la base de datos
ACTUALIZACIÓN ============================================== =======================
Este es un método que utilicé en un caso específico que hacía insertos de sql puro mientras mantenía la compatibilidad de NHibernate.
//this will get the value and update the hi-lo value repository in the datastore
public static void GenerateIdentifier(object target)
{
var targetType = target.GetType();
var classMapping = NHibernateSessionManager.Instance.Configuration.GetClassMapping(targetType);
var impl = NHibernateSessionManager.Instance.GetSession().GetSessionImplementation();
var newId = classMapping.Identifier.CreateIdentifierGenerator(impl.Factory.Dialect, classMapping.Table.Catalog, classMapping.Table.Schema,
classMapping.RootClazz).Generate(impl, target);
classMapping.IdentifierProperty.GetSetter(targetType).Set(target, newId);
}
Entonces, este método toma su entidad recién construida como
var myEnt = new MyEnt(); //has default identifier
GenerateIdentifier(myEnt); //now has identifier injected based on nhibernate''s mapping
tenga en cuenta que esta llamada no coloca a la entidad en ningún tipo de espacio gestionado nhibernate. Así que todavía tienes que hacer un lugar para colocar tus objetos y guardarlos en cada uno. También tenga en cuenta que utilicé este con inserciones sql puro y, a menos que especifique generator="assigned"
(que luego requerirá algún generador hi-lo personalizado) en su entidad, mapear nhibernate puede requerir un mecanismo diferente para persistir.
Con todo, lo que quiere es generar un Id para un objeto que se mantendrá en algún momento en el futuro. Esto trae a colación algunos problemas, como el manejo de entradas inexistentes debido a reversiones y confirmaciones fallidas. Además, el imo nhibernate no es la herramienta para este trabajo en particular, no necesita nhibernate para hacer su inserción masiva a menos que haya alguna lógica de entidad compleja que sea demasiado costosa (en tiempo de desarrollo) para implementarse por su cuenta.
También tenga en cuenta que está dando a entender que necesita entidades independientes transitorias que, sin embargo, no se pueden usar a menos que llame a .nhSes.Save (obj) en la primera sesión y descargue su contenido para que la 2ª sesión cuando llame Load en el objeto transitorio habrá una fila existente en la base de datos que contradice lo que desea lograr.
Imo no tema asaltar la base de datos, simplemente optimice el procedimiento de arriba a abajo para poder manejar el volumen. Usar nhibernate solo para hacer una inserción parece contraproducente cuando puede lograr el mismo resultado con 4 veces el rendimiento usando ado.net o incluso una consulta envolvente isqlquery (y use el método que proporcioné arriba)