Hibernate JPA 根據Java類獲取對應資料庫的表名和欄位名稱
阿新 • • 發佈:2018-12-25
專案中使用 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