Я пытаюсь сгенерировать копию из сущности "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
*/