"Экземпляры IdentifierGenerator обычно создаются и настраиваются службой IdentifierGeneratorFactory. . Обычно неправильно использовать IdentifierGenerator с метааннотацией IdGeneratorType."
Поэтому я считаю, что руководство пользователя hibernate немного вводит в заблуждение. В javadocs я обнаружил, что @IdGeneratorType нужен класс, реализующий интерфейс Generator. Я хочу, чтобы мой собственный генератор реализовывал как OnExecutionGenerator, так и BeforeExecutionGenerator и во время выполнения (при запуске приложения) решал, какая из двух стратегий будет использоваться. Возможно ли это с помощью @IdGeneratorType? Есть ли какие-то примеры/уточнения, которые мне не хватает? (Мне известен интерфейс GenericGenerator, который позволял это, но он устарел с версии 6.5)
У меня есть класс, реализующий как OnExecutionGenerator, так и BeforeExecutionGenerator
Код: Выделить всё
public class BeforeOrOnExecutionGenerator implements BeforeExecutionGenerator, OnExecutionGenerator {
private final BeforeExecutionGenerator beforeExecutionGenerator;
private final OnExecutionGenerator onExecutionGenerator;
private final boolean generateOnExecution;
public BeforeOrOnExecutionGenerator(BeforeExecutionGenerator beforeExecutionGenerator, OnExecutionGenerator onExecutionGenerator, Dialect dialect) {
this.beforeExecutionGenerator = beforeExecutionGenerator;
this.onExecutionGenerator = onExecutionGenerator;
// decide here based on dialect, if id generation should be using a sequence or identity
this.generateOnExecution = dialect instanceof MySQLDialect || ...
logger.info("using dialect: " + dialect);
}
@Override
public boolean generatedOnExecution() {
return this.generateOnExecution;
}
@Override
public boolean generatedOnExecution(Object entity, SharedSessionContractImplementor session) {
return this.generateOnExecution;
}
@Override
public Object generate(SharedSessionContractImplementor session, Object entity, Object currentValue, EventType eventType) {
return beforeExecutionGenerator.generate(session, entity, currentValue, eventType);
}
@Override
public boolean referenceColumnsInSql(Dialect dialect) {
return onExecutionGenerator.referenceColumnsInSql(dialect);
}
@Override
public boolean writePropertyValue() {
return onExecutionGenerator.writePropertyValue();
}
@Override
public String[] getReferencedColumnValues(Dialect dialect) {
return onExecutionGenerator.getReferencedColumnValues(dialect);
}
@Override
public String[] getUniqueKeyPropertyNames(EntityPersister persister) {
return onExecutionGenerator.getUniqueKeyPropertyNames(persister);
}
@Override
public EnumSet getEventTypes() {
return EventTypeSets.INSERT_ONLY;
}
@Override
public InsertGeneratedIdentifierDelegate getGeneratedIdentifierDelegate(PostInsertIdentityPersister persister) {
return onExecutionGenerator.getGeneratedIdentifierDelegate(persister);
}
@Override
public boolean allowAssignedIdentifiers() {
return getCurrentGenerator().allowAssignedIdentifiers();
}
@Override
public boolean generatesSometimes() {
return getCurrentGenerator().generatesSometimes();
}
@Override
public boolean generatesOnInsert() {
return getCurrentGenerator().generatesOnInsert();
}
@Override
public boolean generatesOnUpdate() {
return getCurrentGenerator().generatesOnUpdate();
}
private Generator getCurrentGenerator() {
if (generateOnExecution) {
return onExecutionGenerator;
}
return beforeExecutionGenerator;
}
}
Код: Выделить всё
public class CustomIdGeneratorImpl extends BeforeOrOnExecutionGenerator {
public CustomIdGeneratorImpl(CustomIdGenerator config, Member annotatedMember, CustomIdGeneratorCreationContext context) {
super(new SequenceStyleGenerator(), new IdentityGenerator(), context.getDatabase().getDialect());
}
}
Код: Выделить всё
@Retention(RUNTIME)
@Target({METHOD, FIELD})
@IdGeneratorType(CustomIdGeneratorImpl.class)
public @interface CustomIdGenerator{}
Подробнее здесь: https://stackoverflow.com/questions/790 ... eratortype
Мобильная версия