首页 > 解决方案 > 如何将不同的注释应用于实体属性?

问题描述

我有一个带有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);
  }

}

标签: javaannotations

解决方案


您可以在编译期间使用外部字节码操作框架(例如 JavaAssist)添加注释。但这意味着您当然需要在编译时知道您将使用哪个数据库。


推荐阅读