Двойной класс для использования с Hibernate в другой схеме с Javassist - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь сгенерировать копию из сущности "A" в "AXXX" и добавить аннотацию Entity и Table из hibernate для использования другой схемы, когда я сообщаю сканированию hibernate пакет, в котором был создан этот класс, кажется что они не знают этот класс, когда я использую тогда на выбор. Существует ли способ сделать это? Чтобы добавить этот класс в загрузчик классов jvm, потому что сегодня мне нужны операции между несколькими схемами в одной транзакции с одним и тем же объектом, и я полагаю, что создание объекта динамически может работать хорошо.
Используя класс, сгенерированный методом cloneClass, бросьте любое ошибается, просто не выбирает базу данных

public Class cloneClass(Class classe, String schema) throws Exception {
        String className = classe.getName().concat(schema.toUpperCase());
        boolean classExists;

        try {
            classe = ClassUtils.forName(className, null);
            classExists = true;
        } catch (ClassNotFoundException e) {
            classExists = false;
        }

        if (!classExists) {
            ClassPool pool = javassist.ClassPool.getDefault();
            CtClass newCtClass = pool.getAndRename(classe.getName(), className);
            Table table = classe.getAnnotation(Table.class);
            addAnnotation(newCtClass, table.name(), schema);
            classe = newCtClass.toClass();
        }

        return classe;
    }

    private static void addAnnotation(
            CtClass clazz,
            String tableName, String schemaName) {

        ClassFile cfile = clazz.getClassFile();
        ConstPool cpool = cfile.getConstPool();

        AnnotationsAttribute attr = new AnnotationsAttribute(cpool, AnnotationsAttribute.visibleTag);
        Annotation annot = new Annotation(Table.class.getName(), cpool);
        annot.addMemberValue("name", new StringMemberValue(tableName, cpool));
        annot.addMemberValue("schema", new StringMemberValue(schemaName, cpool));
        attr.addAnnotation(annot);
        cfile.addAttribute(attr);

        AnnotationsAttribute attrEntity = new AnnotationsAttribute(cpool, AnnotationsAttribute.visibleTag);
        Annotation annotEntity = new Annotation(Entity.class.getName(), cpool);
        attrEntity.addAnnotation(annotEntity);
        cfile.addAttribute(attrEntity);
    }


        /*
        //Usage will be something like this and after that instantiate and using normaly
        Class EntityAClass = cloneClass(EntityA.class, "schemaxxx");
        Class EntityBClass = cloneClass(EntityA.class, "schemayyy");
        Session session = entityManager.unwrap(Session.class);

        DetachedCriteria dc1 = DetachedCriteria.forClass(EntityAClass );
        dc1.setProjection(Projections.rowCount());
        Object response1 =  dc1.getExecutableCriteria(session).uniqueResult();

        System.out.println(response1); //here return just null

        */

...