簡體   English   中英

如何獲取JPA實體的列名

[英]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()方法時,我們不知道它被調用的實體,可能是MyEntity1MyEntity2等。

我試過做類似下面的事情:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM