Как применить разные аннотации к свойству объекта? - PullRequest
0 голосов
/ 26 июня 2018

У меня есть абстрактный базовый класс сущности со свойством id.

Я бы хотел, чтобы к этому свойству применялись специальные аннотации, если текущая база данных H2:

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = id_generator")
@Column(name = "id")
private Long id;

И некоторые другие конкретные аннотации, применяемые к этому свойству, если текущая база данных - MySQL:

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
@GenericGenerator(name = "native", strategy = "native")
@Column(name = "id")
private Long id;

Базовый класс:

@MappedSuperclass
public abstract class AbstractEntity {

Все классы сущностей расширяют базовый класс, как:

@Entity
@Table(name = "user_account")
@SequenceGenerator(name = "id_generator", sequenceName = "sq_id_user")
public class User extends AbstractEntity {

Может быть, я мог бы использовать некоторые условные пользовательские аннотации?

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Conditional(DbH2Condition.class)
public @interface DbH2 {
}

public class DbH2Condition implements Condition {

  private static final String DB = "h2";

  @Override
  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    return context.getEnvironment().getProperty("db") == null
        || context.getEnvironment().getProperty("db").equals(DB);
  }

}

1 Ответ

0 голосов
/ 26 июня 2018

вы можете добавлять аннотации, используя внешнюю структуру манипулирования байтовым кодом, такую ​​как JavaAssist, во время компиляции. Но это значит, что вам нужно знать во время компиляции, какую базу данных вы будете использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...