@Override public void onSaveOrUpdate(SaveOrUpdateEvent event) throws HibernateException { try { // this event is called when hibernate try to persist entities using cascade (save) TopiaPersistenceContext context = getContext(event); // warning, event.getEntity() return null here :( if (context != null && event.getObject() instanceof TopiaEntity) { TopiaEntity entity = (TopiaEntity) event.getObject(); if (StringUtils.isBlank(entity.getTopiaId())) { if (log.isDebugEnabled()) { log.debug("Adding topiaId into entity " + entity.getClass()); } // TopiaIdFactory#newTopiaId only requires interface. First get the entity class name. String entityClassName = event.getEntityName(); // event.getEntityName() may be null in case .update(...) method is called on a new (not yet persisted) entity (see http://nuiton.org/issues/3153) if (Strings.isNullOrEmpty(entityClassName)) { entityClassName = entity.getClass().getName(); } // Then extract interface name // FIXME echatellier 20130713 : hack to find interface for current entity class Class entityInterface = Class.forName(entityClassName.replace("Impl", "")); // Generate topiaId String topiaId = context.getTopiaIdFactory().newTopiaId(entityInterface, entity); entity.setTopiaId(topiaId); } } } catch (ClassNotFoundException ex) { throw new HibernateException("Can't set id", ex); } }