java - 如何将不同的注释应用于实体属性?
问题描述
我有一个带有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);
}
}
解决方案
您可以在编译期间使用外部字节码操作框架(例如 JavaAssist)添加注释。但这意味着您当然需要在编译时知道您将使用哪个数据库。
推荐阅读
- xamarin - 错误:操作无法完成。(com.google.fcm 错误 501)
- r - 在运行多个需要访问集群的 R 程序(接近 20 个)时设置 H2O 集群
- jquery-ui - 无法使用 jquery-ui-sortable 将项目拖到最后一项下方
- user-interface - 适用于 iOS 的 Zendesk SDK
- css - 使用 CSS 选择器应用样式不起作用
- flutter - 如何在 CustomScrollView 中设置绘制顺序
- ios - 如何创建队列并手动启动它
- c++ - 一个非常简单的win32 socket代码,但是工作错误
- linux - 查找 shell 变量是否包含特定字符串并对其进行注释
- python - OR-Tools - 使用 CP-SAT 通过最小化进行分类