【发布时间】:2018-03-02 07:39:46
【问题描述】:
我所有的 JPA 实体类都实现了一个名为 Entity 的接口,它的定义如下:
public interface Entity extends Serializable {
// some methods
}
我的 JPA 实体的某些字段顶部有 @Column 注释,而有些则没有。 MyEntity 类定义如下:
@Entity
public class MyEntity implements Entity {
@Id
private Long id; // Assume that it is auto-generated using a sequence.
@Column(name="field1")
private String field1;
private SecureString field2; //SecureString is a custom class
//getters and setters
}
我的删除方法接受一个实体。
@Override
public void delete(Entity baseEntity) {
em.remove(baseEntity); //em is entityManager
}
每当调用 delete 方法时,我想要在我的 delete 方法中做三件事:
1) MyEntity 类型为 SecureString 的字段
2) DB 中该特定字段的列名(该字段可能有也可能没有@Column 注释)
3)id字段的值
注意当delete()方法被调用时,我们不知道它是针对哪个实体调用的,可能是针对MyEntity1、MyEntity2等。
我尝试过如下操作:
for (Field field : baseEntity.getClass().getFields()) {
if (SecureString.class.isAssignableFrom(field.getType())) {
// But the field doesn't have annotation @Column specified
Column column = field.getAnnotation(Column.class);
String columnName = column.name();
}
}
但这只有在字段有 @Column 注释时才有效。它也没有得到我需要的其他两件事。有什么想法吗?
【问题讨论】:
-
Column name of that particular field in DB (The field may or may not have '@Column' annotation)..您是在创建数据库表还是允许 Hibernate 创建它们?如果 hibernate 正在创建并且您没有提及“@Column”,则变量名将作为列名的默认值。 -
@KaustubhKallianpur 我允许休眠创建数据库表。有些字段有“@Column”注释,有些则没有。我同意你最后的说法。我需要有一个条件来检查特定字段是否用“@Column”注释,并且应该根据该列名获取。
-
Hibernate 获取整行和该行的所有列,并将其存储到相应的实体中。您可以使用实体中提供的 Getter 方法来获取这些变量的值。
-
以及如何将Entity接口引用转换为MyEntity类(因为我不知道该实例是MyEntity的,所以我不能执行直接转换。它可以是MyEntity1,MyEntity2等等。)?获得对象后,我仍然需要确定 SecureString 类型上的哪些属性以及获取它的值,我该如何实现呢?你能提出一个答案吗?
-
(因为我不知道该实例属于 MyEntity。)您的意思是您不知道要获取哪一行?
标签: java hibernate jpa jakarta-ee reflection