2010-01-05 32 views
5

Tôi có một đoạn mã duy trì rằng nên cấp lựa chọn đặc quyền cho một người dùng nhất định tại một số điểm thời gian:Bắt tất cả các thực thể ánh xạ từ EnitityManager

grant select on A_DB.A_TABLE to READ_ONLY_USER; 

Tôi muốn làm điều này cho tất cả các bảng. Tôi có thể sử dụng select * from tab trong Oracle hoặc show tables trong MySQL để có danh sách đầy đủ và sau đó tiếp tục như vậy.

Nhưng kể từ khi tôi đã có đối tượng javax.persistence.EntityManager trong tay, tôi tự hỏi liệu có cách nào khác để có được tất cả các thực thể được ánh xạ hay không, Trình quản lý biết (Tôi đang sử dụng Hibernate dưới mui xe).

+0

Bạn có thể kiểm tra điều này :: http://stackoverflow.com/questions/ 43604928/hibernate-upgrade-to-5-2-session-factory-creation-and-replace-persistentclas/43718626 –

Trả lời

9

Có hai cách mà tôi có thể thấy nhận được tất cả các đơn vị lập bản đồ và bảng SQL tương ứng của họ (có thể có những người khác).

Các straightfoward nhất là nếu bạn có thể sử dụng đối tượng Hibernate Cấu hình của bạn:

for(Iterator it = config.getClassMappings(); it.hasNext();){ 
     PersistentClass pc = (PersistentClass) it.next(); 
     System.out.println(pc.getEntityName() + "\t" + pc.getTable().getName()); 
    } 

Ngoài ra, bạn có thể làm một chút đúc hơn và nhận được thông tin này cùng ra khỏi SessionFactory quá:

Map<String, ClassMetadata> map = (Map<String, ClassMetadata>) sessionFactory.getAllClassMetadata(); 
    for(String entityName : map.keySet()){ 
     SessionFactoryImpl sfImpl = (SessionFactoryImpl) sessionFactory; 
     String tableName = ((AbstractEntityPersister)sfImpl.getEntityPersister(entityName)).getTableName(); 
     System.out.println(entityName + "\t" + tableName); 
    } 
+0

Tôi không thể truy cập Cấu hình Hibernate nhưng giải pháp thứ hai hoạt động. – raoulsson

0

Kiểm tra những gì có sẵn trong Map này:

((Session) entityManager.getDelegate()).getSessionFactory().getAllClassMetadata() ; 
+0

Siêu dữ liệu lớp thực sự bị giới hạn đối với các thuộc tính của thực thể và không chứa bất kỳ dữ liệu liên quan đến ánh xạ nào. Điều này sẽ tốt nếu các bảng DB được đặt tên giống như các thực thể. – BryanD

+0

tốt, có vẻ như getAllClassMetadata là giải pháp được tìm kiếm. Câu trả lời của bạn là chi tiết hơn, tất nhiên .. Tôi có lẽ không nên đưa ra gợi ý, nhưng giải pháp hoàn chỉnh. Tuy nhiên, tôi cảm thấy có điều gì đó sai trái với điều đó :) – Bozho

0

Nếu bạn có javax.persistence.EntityManager trong tay., Phương pháp sau đây có thể giúp bạn có được danh sách tất cả các tên bảng:

private List<String> getAllTables() { 
    List<String> tableNames = new ArrayList<>(); 
    Session session = entityManager.unwrap(Session.class); 
    SessionFactory sessionFactory = session.getSessionFactory(); 
    Map<String, ClassMetadata> map = (Map<String, ClassMetadata>) sessionFactory.getAllClassMetadata(); 
    for(String entityName : map.keySet()){ 
     SessionFactoryImpl sfImpl = (SessionFactoryImpl) sessionFactory; 
     String tableName = ((AbstractEntityPersister)sfImpl.getEntityPersister(entityName)).getTableName(); 
     tableNames.add(tableName); 
    } 
    return tableNames; 
} 
5

Kể từ năm 2016 (Hibernate 5.2), cả hai getAllClassMetadataConfiguration đều không được chấp nhận.

Tôi đoán đây có thể được sử dụng thay:

Set<EntityType<?>> entities = sessionFactory.getMetamodel().getEntities(); 

Trong đặc biệt, để có được các lớp:

List<?> classes = entities.stream() 
          .map(EntityType::getJavaType) 
          .filter(Objects::nonNull) 
          .collect(Collectors.toList()); 
+0

Di chuyển từ HIbernate 3 đến 5.2.10. Tôi cần phải nhận được từ "thực thể" như bạn đã xác định, để PersistentClass. Điều đó có thể không? – Vering

+0

Xem câu trả lời của tôi ở đây: http://stackoverflow.com/questions/32780664/hibernate-migration-from-4-3-x-to-5-x-for-method-org-hibernate-cfg-configuration/43653061# 43653061 – Vering

Các vấn đề liên quan