如何将不同的注释应用于实体属性?

时间:2018-06-26 17:34:18

标签: java annotations

我有一个具有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 :(得分:0)

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