[英]JPA2.0 mapping a map of Map<Entity0,Entity1> how do I specify column names?
[英]How to get Column names of JPA entity
我的所有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
注釋時才有效。 它也沒有讓我得到我需要的其他兩件事。 有任何想法嗎?
Hibernate可以使用不同的命名策略來映射屬性名稱,這些屬性名稱是隱式定義的(沒有@Column(name =“...”))。 要擁有“物理”名稱,您需要深入了解Hibernate內部。 首先,您必須將EntityManagerFactory
到您的服務。
@Autowired
private EntityManagerFactory entityManagerFactory;
其次,您必須為您的類檢索AbstractEntityPersister
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
AbstractEntityPersister persister = ((AbstractEntityPersister)sessionFactory.getClassMetadata(baseEntity.getClass()));
第三,你的代碼幾乎就在那里。 你只需要處理這兩種情況 - 有和沒有@Column注釋。 嘗試這個:
for (Field field : baseEntity.getClass().getFields()) {
if (SecureString.class.isAssignableFrom(field.getType())) {
String columnName;
if (field.isAnnotationPresent(Column.class)) {
columnName = field.getAnnotation(Column.class).name();
} else {
String[] columnNames = persister.getPropertyColumnNames(field.getName());
if (columnNames.length > 0) {
columnName = columnNames[0];
}
}
}
}
請注意, getPropertyColumnNames()
僅檢索“屬性”字段,這些字段不是主鍵的一部分。 要檢索鍵列名,請使用getKeyColumnNames()
。
關於id
字段。 你真的需要在兒童班中擁有所有@Id? 也許最好將@Id移動到Entity
類並用@MappedSuperclass注釋標記這個類? 然后你可以使用baseEntity.getId();
來檢索它baseEntity.getId();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.