従来の方法では、アノテーションは事実上定数なので、従来の方法で変更することはできません。 Datastaxオブジェクトマッパーは、マッピングされたオブジェクトのテーブルをオンザフライで切り替える方法を公開していないので、より暗い芸術を採用する必要があります:バイトコードの操作。
Measurementの注釈を直接操作している可能性がありますが、をに変更する必要はありません。その結果、Measurement
クラスは、その注釈を失うべきで、抽象行われる。
public class Measurement { /*...*/ }
次に、実際のテーブル名が知られると、1は正しい注釈付きサブクラスを生成するためにJavassistのを使用することができます。
String modelname = getNameFromExternalSource(); //Replace with real external source.
String modelcleanname = modeldir.getName().replaceAll("\\W", "");
ClassPool pool = ClassPool.getDefault();
String measurementclassname = "measurementtable_" + modelcleanname;
CtClass stagingmeasurementclass = pool.makeClass(measurementclassname);
stagingmeasurementclass.setSuperclass(pool.get(StagingMeasurementRecord.class.getName()));
stagingmeasurementclass.setModifiers(Modifier.PUBLIC);
ClassFile stagingmeasurementclassfile = stagingmeasurementclass.getClassFile();
ConstPool constpool = stagingmeasurementclassfile.getConstPool();
AnnotationsAttribute attribute = new AnnotationsAttribute(constpool,
AnnotationsAttribute.visibleTag);
Annotation tableannotation = new Annotation(constpool, pool.get(Table.class.getName()));
tableannotation.addMemberValue("name", new StringMemberValue(measurementclassname, constpool));
tableannotation.addMemberValue("keyspace", new StringMemberValue("mykeyspace", constpool));
attribute.addAnnotation(tableannotation);
stagingmeasurementclassfile.addAttribute(attribute);
stagingmeasurementclass.addConstructor(
CtNewConstructor.make(new CtClass[0], new CtClass[0], stagingmeasurementclass));
Class<? super StagingMeasurementRecord> myoutputclass = stagingmeasurementclass.toClass();
LOGGER.info("Created custom measurementtable class with the name " + myoutputclass.getName());
myoutputclass
インスタンスをMappingManagerInstance.mapper(...)
呼び出しに供給して、目的のテーブルを指すオブジェクトマッパーを作成することができます。
バイトコードの操作が必要だが、入力ごとに再コンパイルしたり、オブジェクトに対して同じクラスを作成したりするのを避けている限り、バイトコード操作が必要であるということを考えれば、それは最善の解決策ではない。