I have a piece of maintenance code that should grant select privileges to a certain user at certain points of time:
grant select on A_DB.A_TABLE to READ_ONLY_USER;
I want to do this for all tables. I could use select * from tab
in Oracle or show tables
in MySQL to get the complete list and then move on like that.
But since I already have the javax.persistence.EntityManager
Object at hand, I wondered if there is another way to get at all the mapped Entities, the Manager knows about (I am using Hibernate under the hood).
Step 2: Obtaining an Entity Manager From a Factory EntityManager entityManager = entityManagerFactory. createEntityManager(); EntityManager — An EntityManager is an interface. createEntityManager() method — It creates a new application-managed EntityManager.
EntityManagerFactory vs EntityManagerWhile EntityManagerFactory instances are thread-safe, EntityManager instances are not. The injected JPA EntityManager behave just like an EntityManager fetched from an application server's JNDI environment, as defined by the JPA specification.
You can use the @PersistenceContext annotation to inject an EntityManager in an EJB 3.0 client (such as a stateful or stateless session bean, message-driven bean, or servlet). You can use @PersistenceContext attribute unitName to specify a persistence unit by name, as Example 29-13 shows.
As of 2016 (Hibernate 5.2), both getAllClassMetadata
and Configuration
are deprecated.
I guess this could be used instead:
Set<EntityType<?>> entities = sessionFactory.getMetamodel().getEntities();
In special, to get the classes:
List<?> classes = entities.stream()
.map(EntityType::getJavaType)
.filter(Objects::nonNull)
.collect(Collectors.toList());
There are two ways that I can see getting all of the mapped entities and their corresponding SQL tables (there may be others).
The most straightfoward is if you can use your Hibernate Configuration object:
for(Iterator it = config.getClassMappings(); it.hasNext();){
PersistentClass pc = (PersistentClass) it.next();
System.out.println(pc.getEntityName() + "\t" + pc.getTable().getName());
}
Alternatively, you can do a little more casting and get this same information out of the SessionFactory too:
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);
}
as MarcG answer states the getAllClassMetadata()
is deprecated since few years ago
As of Hibernate - 5.4.30.Final - released March 19th, 2021 The code below works and is not deprecated :
MetamodelImplementor metaModelImpl = (MetamodelImplementor)session.getMetamodel();
Map<String, EntityPersister> entityPersisters = metaModelImpl.entityPersisters();
Collection<EntityPersister> val = entityPersisters.values();
for (EntityPersister ep : val) {
AbstractEntityPersister aep = (AbstractEntityPersister)ep;
System.out.println(aep.getTableName());
System.out.println(Arrays.toString(aep.getIdentifierColumnNames()));
for (String propName : aep.getPropertyNames()) {
System.out.println(propName);
System.out.println(Arrays.toString(aep.getPropertyColumnNames(propName)));
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With