Advertisement
Guest User

Untitled

a guest
Apr 29th, 2022
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.63 KB | None | 0 0
  1. public class HibernateSecondaryTableFixIntegrator implements Integrator {
  2.  
  3.   private static final Logger log = LoggerFactory.getLogger(CacheInstanceActionController.class);
  4.  
  5.   @Override
  6.   public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactoryImplementor,
  7.                         SessionFactoryServiceRegistry sessionFactoryServiceRegistry) {
  8.     fixSqlStatementsSecondaryTable(metadata);
  9.   }
  10.  
  11.   @Override
  12.   public void disintegrate(SessionFactoryImplementor sessionFactoryImplementor, SessionFactoryServiceRegistry sessionFactoryServiceRegistry) {
  13.     // nothing to do
  14.   }
  15.  
  16.   private void fixSqlStatementsSecondaryTable(Metadata metadata) {
  17.     for (PersistentClass entityBinding : metadata.getEntityBindings()) {
  18.       if (isSecondaryTablePresent(entityBinding)) {
  19.         addAnnotationsCustomSqlIfNecessary(entityBinding);
  20.       }
  21.     }
  22.   }
  23.  
  24.   private void addAnnotationsCustomSqlIfNecessary(PersistentClass entityBinding) {
  25.     List<String> secondaryTables = getSecondaryTablesOnEntity(entityBinding);
  26.     List<String> secondaryTablesHeritage = getSecondaryTablesInInheritance(entityBinding);
  27.     secondaryTables.stream()
  28.                    .filter(secondaryTablesHeritage::contains)
  29.                    .forEach(st -> addCustomSqlInsert(entityBinding, st));
  30.  
  31.   }
  32.  
  33.   private void addCustomSqlInsert(PersistentClass entityBinding, String secondaryTable) {
  34.     Iterator<Join> joinIterator = entityBinding.getJoinIterator();
  35.     while (joinIterator.hasNext()) {
  36.       Join join = joinIterator.next();
  37.       if (join.getTable().getName().equals(secondaryTable)) {
  38.         String table = join.getTable().getName();
  39.         String idColumn = findIdColumn(entityBinding);
  40.         String propertiesUpdate = buildPropertiesUpdateString(join);
  41.         String customSqlInsert = "Update " + table + propertiesUpdate + " WHERE " + idColumn + " = ?";
  42.         join.setCustomSQLInsert(customSqlInsert, false, ExecuteUpdateResultCheckStyle.NONE);
  43.         log.info("Correction de la requête SQL appliquée pour l'entity {}, sur la SecondaryTable {}", entityBinding.getClassName(), secondaryTable);
  44.       }
  45.     }
  46.   }
  47.  
  48.   private String buildPropertiesUpdateString(Join join) {
  49.     String propertiesUpdateString = " SET";
  50.  
  51.     Iterator<Property> propertyIterator = join.getPropertyIterator();
  52.     while (propertyIterator.hasNext()) {
  53.       Property property = propertyIterator.next();
  54.       propertiesUpdateString = propertiesUpdateString.concat(" " + property.getName() + " = ? ,");
  55.     }
  56.     return StringUtils.chop(propertiesUpdateString);
  57.   }
  58.  
  59.   private List<String> getSecondaryTablesInInheritance(PersistentClass entityBinding) {
  60.     List<String> secondaryTableDansHeritage = new ArrayList<>();
  61.     PersistentClass parent = entityBinding.getSuperclass();
  62.     while (parent != null) {
  63.       secondaryTableDansHeritage.addAll(getSecondaryTablesOnEntity(parent));
  64.       parent = parent.getSuperclass();
  65.     }
  66.     return secondaryTableDansHeritage;
  67.   }
  68.  
  69.   private List<String> getSecondaryTablesOnEntity(PersistentClass entityBinding) {
  70.     List<String> secondaryTablesSurEntity = new ArrayList<>();
  71.     entityBinding.getJoinIterator().forEachRemaining(join -> secondaryTablesSurEntity.add(((Join) join).getTable().getName()));
  72.     return secondaryTablesSurEntity;
  73.   }
  74.  
  75.   private String findIdColumn(PersistentClass entityBinding) {
  76.     Column column = (Column) entityBinding.getIdentifierProperty().getColumnIterator().next();
  77.     return column.getName();
  78.   }
  79.  
  80.   private boolean isSecondaryTablePresent(PersistentClass entityClass) {
  81.     return entityClass.getMappedClass().getAnnotation(SecondaryTable.class) != null;
  82.   }
  83. }
  84.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement