/** * Создает в базе новый экземпляр объекта по заданному шаблону в первоначальном статусе и * возвращает его. * * @param templateId - идентификатор шаблона. * @return - экземпляр объекта. */ public Instance createInstance(Long templateId) { ru.skycelot.plicanterra.metamodel.transfer.Template template = metamodel.getTemplate(templateId); Instance instance = InstanceInitializer.createInstanceFromTemplate(template); try (Database database = new Database(data)) { instance.id = database.getNextInstanceSequenceValue(); database.saveTemplateCodeOfInstance(instance.id, instance.template.code); instance.version = 1L; InsertQuery query = new InsertQuery(instance.template.code); query.addInlineColumn("ID", instance.id); query.addInlineColumn("STATUS_ID", instance.status.id); query.addInlineColumn("VERSION", instance.version); database.execute(query); return instance; } catch (IOException e) { throw new RuntimeException(e); } }
/** * Вставляет в базу заполненный клиентом объект в начальном статусе. * * @param instance - заполненный экземпляр объекта * @return - идентификатор созданного объекта. */ public Long createInstance(Instance instance) { ArgumentsChecker.notNull(new Argument("instance", instance)); try (Database database = new Database(data)) { ru.skycelot.plicanterra.metamodel.transfer.Template template = findTemplate(instance.template); checkStatusForSameness(instance.status, template.status, template.code); instance.id = database.getNextInstanceSequenceValue(); database.saveTemplateCodeOfInstance(instance.id, instance.template.code); instance.version = 1L; InsertQuery query = new InsertQuery(instance.template.code); query.addInlineColumn("ID", instance.id); query.addInlineColumn("STATUS_ID", template.status.id); query.addInlineColumn("VERSION", instance.version); processAttributes(instance.attributes, template, query); List<InsertQuery> joinLinks = new LinkedList<>(); List<UpdateQuery> referencedLinks = new LinkedList<>(); processLinks(instance.links, template, query, joinLinks, referencedLinks, instance.id); database.execute(query); for (InsertQuery linkQuery : joinLinks) { database.execute(linkQuery); } for (UpdateQuery linkQuery : referencedLinks) { database.execute(linkQuery); } return instance.id; } catch (IOException e) { throw new RuntimeException(e); } }