1. 程式人生 > >Hibernate JPA 根據Java類獲取對應資料庫的表名和欄位名稱

Hibernate JPA 根據Java類獲取對應資料庫的表名和欄位名稱

專案中使用 Hibernate JPA, 需求是根據 Entity的java 類,來獲取所有的對應的資料庫欄位。

直接上程式碼。

使用者類,對應資料庫的user表

import org.hibernate.validator.constraints.NotBlank;

import javax.persistence.*;
import javax.validation.constraints.Size;
import java.util.Date;

@Entity
@Table(name = "my_user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    private Integer id;

    @Size(max=255)
    @NotBlank
    private String name;

    @Size(max=255)
    private String account;

    private Integer age;

    private Date birthday;

    @Column(name = "my_hope")
    private String myHope;
       
    ... //省略setter getter方法
}

通過JPA的EntityManagerFactory可以找到專案中所有的Entity,然後輸出用jpa提供的方法找到每一個Entity對應的表名和欄位名。

//通過EntityManager獲取factory
EntityManagerFactory entityManagerFactory = (你自己的entityManager物件).getEntityManagerFactory();
SessionFactoryImpl sessionFactory = (SessionFactoryImpl)entityManagerFactory.unwrap(SessionFactory.class);
Map<String, EntityPersister> persisterMap = sessionFactory.getEntityPersisters();
for(Map.Entry<String,EntityPersister> entity : persisterMap.entrySet()){
    Class targetClass = entity.getValue().getMappedClass();
    SingleTableEntityPersister persister = (SingleTableEntityPersister)entity.getValue();
    Iterable<AttributeDefinition> attributes = persister.getAttributes();
    String entityName = targetClass.getSimpleName();//Entity的名稱
    String tableName = persister.getTableName();//Entity對應的表的英文名

    System.out.println("類名:" + entityName + " => 表名:" + tableName);

    //屬性
    for(AttributeDefinition attr : attributes){
        String propertyName = attr.getName(); //在entity中的屬性名稱
        String[] columnName = persister.getPropertyColumnNames(propertyName); //對應資料庫表中的欄位名
        String type = "";
        PropertyDescriptor targetPd = BeanUtils.getPropertyDescriptor(targetClass, propertyName);
        if(targetPd != null){
            type = targetPd.getPropertyType().getSimpleName();
        }
        System.out.println("屬性名:" + propertyName + " => 型別:" + type + " => 資料庫欄位名:" + columnName[0]);
    }

}

最後可以看到User類的輸出為:

類名:User => 表名:my_user
屬性名:account => 型別:String => 資料庫欄位名:account
屬性名:age => 型別:Integer => 資料庫欄位名:age
屬性名:birthday => 型別:Date => 資料庫欄位名:birthday
屬性名:myHope => 型別:String => 資料庫欄位名:my_hope
屬性名:name => 型別:String => 資料庫欄位名:name