【问题标题】:Java Annotation To Insert In Database插入数据库的 Java 注释
【发布时间】:2026-01-25 06:30:01
【问题描述】:

我有一个以键值格式存储数据的数据库,例如:

|---------------------|------------------|
|      Key            |     Value        |
|---------------------|------------------|
|      KEY_FOR_NAME   |     Abhishek     |
|---------------------|------------------|

目前,要将数据存储在此表中,对于每个键,我会执行以下操作:

String additionalInfoValue = "Abhishek";
AdditionalInfo additionalInfo = new AdditionalInfo(); //entity object
additionalInfo.setKey("KEY_FOR_NAME");
additionalInfo.setSolutionValue(additionalInfoValue);

该表中有很多键值对,因此会产生很多类似上面提到的代码。

我想做的是做一些注释,例如:

@StoreInTable("KEY_FOR_NAME")
String additionalInfoValue = "Abhishek";

这会将我的数据保存在表格中,并避免像上面提到的那样不必要的代码。

我在我的项目中使用 Spring 和 Hibernate 来进行所有实体和数据库查询 (HQL)。

【问题讨论】:

  • 即便如此,您仍然需要在注解的处理程序中编写该代码。
  • @Stultuske 这意味着用数千行代码换取一个处理程序代码。
  • ?不,它不会。这可以通过代码重用来实现,只需比创建注释、处理程序和编写代码更少的代码。
  • 为什么不只是一个传递键和值的方法,然后执行插入?
  • 为什么不直接写一个方法?

标签: java spring hibernate annotations


【解决方案1】:

如果我理解正确的话,这只是一个简单的 Java 反射问题。如下所示:

定义@StoreInTable

@Target(FIELD)
@Retention(RUNTIME)
public @interface StoreInTable {
    String value();
}

编写一个函数,将任何实例的 @StoreInTable 设置打包到 AdditionalInfo 列表中:

public class FooUtil {

    public static List<AdditionalInfo> packAdditionalInfo(Object instance) throws Exception {
        List<AdditionalInfo> result = new ArrayList<>();
        for (Field field : instance.getClass().getDeclaredFields()) {
            field.setAccessible(true);
            StoreInTable storeInTable = field.getAnnotation(StoreInTable.class);
            if (storeInTable != null) {
                AdditionalInfo info = new AdditionalInfo();
                info.setKey(storeInTable.value());
                info.setValue(field.get(instance).toString());
                result.add(info);
            }
        }
        return result;
    }
}

要使用它,定义表示键值对的任何类,可能是:

public class KeyValue {

    @StoreInTable("KEY1")
    String additionalInfoValue1 = "Abhishek";

    @StoreInTable("KEY2")
    String additionalInfoValue2 = "Keshri";
}

然后:

List<AdditionalInfo> infoList = FooUtil.packAdditionalInfo(new KeyValue());
for(AdditionalInfo info : infoList){
    //save the info one by one , in this case it would save (key=KEY1, value=Abhishek) and (key=KEY2 , value=Keshri)
    entityManage.persist(info);
}

【讨论】:

  • 是的,我在想这条线上的东西,会试试看!