diff --git a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NReadEventListener.java b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NReadEventListener.java index cb681348553d7653a105c820f1ed6d4e04d5558f..7d2970ec41781c9665ffa9e3a144c93b1ee84b69 100644 --- a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NReadEventListener.java +++ b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NReadEventListener.java @@ -22,6 +22,8 @@ import org.slf4j.LoggerFactory; import org.springframework.context.i18n.LocaleContextHolder; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import com.google.common.collect.Interner; +import com.google.common.collect.Interners; /** */ public class I18NReadEventListener implements PostLoadEventListener { @@ -32,6 +34,8 @@ public class I18NReadEventListener implements PostLoadEventListener { private SessionFactoryImplementor sessionFactory; + private Interner pool = Interners.newWeakInterner(); + @SuppressWarnings("rawtypes") private Cache cache = CacheBuilder.newBuilder().expireAfterAccess(1, TimeUnit.MINUTES).build(); @@ -80,7 +84,7 @@ public class I18NReadEventListener implements PostLoadEventListener { * @throws InvocationTargetException */ private Map getTranslate( - StatelessSession session, I18NTranslates i18n, Object entity, Class clazz) + StatelessSession session, I18NTranslates i18n, Object entity, @SuppressWarnings("rawtypes") Class clazz) throws IllegalAccessException, InvocationTargetException { Object id = getPKValue(clazz, entity); String language = LocaleContextHolder.getLocale().toString(); @@ -93,6 +97,7 @@ public class I18NReadEventListener implements PostLoadEventListener { return translateTable.get(id); } + @SuppressWarnings("unchecked") private Map> translateTable( StatelessSession session, String table, @@ -102,25 +107,33 @@ public class I18NReadEventListener implements PostLoadEventListener { String key = "Table:" + table + "_" + language; Map> result = cache.getIfPresent(key); if (result == null) { - logger.trace("translate query, table: {}", table); - String sql = String.format("select * from %s where languageCode = ?", table); - SQLQuery query1 = session.createSQLQuery(sql); - query1.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); - query1.addScalar(idColumn); - for (I18NTranslate i18nTranslate : mapping) { - query1.addScalar(i18nTranslate.column()); - } - query1.setParameter(0, language); - List> result1 = query1.list(); - result = new HashMap<>(); - for (Map map : result1) { - result.put(map.get(idColumn), map); + synchronized (pool.intern(key)) { + result = cache.getIfPresent(key); + if (result == null) { + logger.trace("translate query, table: {}", table); + String sql = String.format("select * from %s where languageCode = ?", table); + SQLQuery query1 = session.createSQLQuery(sql); + query1.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); + query1.addScalar(idColumn); + query1.addScalar("languageCode"); + for (I18NTranslate i18nTranslate : mapping) { + query1.addScalar(i18nTranslate.column()); + } + query1.setParameter(0, language); + List> result1 = query1.list(); + result = new HashMap<>(); + for (Map map : result1) { + map.remove("languageCode"); + result.put(map.get(idColumn), map); + } + cache.put(key, result); + } } - cache.put(key, result); } return result; } + private Object getPKValue(Class clazz, Object entity) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { Collection fields = getAllDeclaredFields(clazz); @@ -132,29 +145,11 @@ public class I18NReadEventListener implements PostLoadEventListener { } for (Method method : clazz.getDeclaredMethods()) { if (method.getAnnotation(Id.class) != null) { - return method.invoke(entity, null); + return method.invoke(entity); } } return null; } - /** - * Returns the entity's @{@link I18NTranslate} fields. - * - *

These fields are made accessible. - */ - private static Collection getLocalizedFields(Class clazz) { - Collection fields = getAllDeclaredFields(clazz); - List localizedFields = new ArrayList<>(); - fields - .stream() - .filter(field -> field.getAnnotation(I18NTranslate.class) != null) - .forEach( - field -> { - field.setAccessible(true); - localizedFields.add(field); - }); - return localizedFields; - } private static Collection getAllDeclaredFields(Class clazz) { List fields = new ArrayList<>();