当前位置: 首页 > news >正文

诸暨市建设局网站浏览器2345网址导航下载安装

诸暨市建设局网站,浏览器2345网址导航下载安装,wordpress 亲子,2017电商网站建设背景在使用JPA侦听器进行数据库加密中#xff0c;我讨论了使用JPA EntityListener进行透明加密。 从某种意义上说#xff0c;这种方法是透明的#xff0c;因为JPA实体#xff08;几乎#xff09;完全不知道正在加密#xff0c;而JPA EntityListener本身也不知道细节。 有一个… 在使用JPA侦听器进行数据库加密中我讨论了使用JPA EntityListener进行透明加密。 从某种意义上说这种方法是透明的因为JPA实体几乎完全不知道正在加密而JPA EntityListener本身也不知道细节。 有一个大问题。 EJB3可以将资源注入到EntityListener中。 春天不能。 注意我指的是JPA EntityListeners而不是AOP方法。EntityListener必须在更严格的约束下工作。 跳过一年我有解决方案。 有一个很大的警告仅当您知道您的JPA实现为Hibernate 4.0.0.Final或更高版本时此方法才有效。 在您的设计中引入实现细节从来都不是一件有趣的事但是幸运的是我们几乎可以隐藏所有细节。 休眠回调 Hibernate已经进行了多年的回调。 我不知道它们的使用范围-如果您不小心它们就是会导致供应商锁定的东西。 供应商锁定就是我和其他许多人尝试保持纯JPA的原因。 遗憾的是有时JPA还不够。 输入将近两年前的博客文章 使用JPA的Spring管理的事件侦听器 。 切入Hibernate 4.0.0.Final后的代码添加Hibernate侦听器很容易。 这些不是JPA EntityListener但让我们一次仅一步。 /*** Configure Spring-aware entity listeners. This implementation is* hibernate-specific.* * See: http://deepintojee.wordpress.com/2012/02* /05/spring-managed-event-listeners-with-jpa/* * Another approach follows, but it doesnt support Spring injection.* http://stackoverflow.com/questions/8616146/eventlisteners-using-hibernate* -4-0-with-spring-3-1-0-release* * author louis.gueyegmail.com (see above)* author Bear Giles bgilescoyotesong.com*/ Component public class HibernateListenersConfigurer {private static final Logger log LoggerFactory.getLogger(HibernateListenersConfigurer.class);Resourceprivate EntityManagerFactory emf;Resourceprivate HibernateListenersAdapter listener;PostConstructpublic void registerListeners() {HibernateEntityManagerFactory hemf (HibernateEntityManagerFactory) emf;SessionFactory sf hemf.getSessionFactory();EventListenerRegistry registry ((SessionFactoryImpl) sf).getServiceRegistry().getService(EventListenerRegistry.class);registry.getEventListenerGroup(EventType.PRE_INSERT).appendListener(listener);registry.getEventListenerGroup(EventType.POST_COMMIT_INSERT).appendListener(listener);registry.getEventListenerGroup(EventType.PRE_UPDATE).appendListener(listener);registry.getEventListenerGroup(EventType.POST_COMMIT_UPDATE).appendListener(listener);registry.getEventListenerGroup(EventType.PRE_DELETE).appendListener(listener);registry.getEventListenerGroup(EventType.POST_COMMIT_DELETE).appendListener(listener);registry.getEventListenerGroup(EventType.POST_LOAD).appendListener(listener);} }Hibernate / JPA适配器 上一个类是一个好的开始但是注入弹簧的侦听器需要使用Hibernate实体侦听器注释而不是标准的JPA javax.persistence注释。 我们可以做得更好吗 快速的答案是肯定的-通过反思很简单。 见下文。 并非如此Swift的答案是肯定的但是正确地进行反思可能很棘手。 您需要考虑超类和接口例如可以为Auditable接口而不是特定的类编写EntityListener。 排序可能变得很重要尤其是在注释了一个类及其超类时。 我不会在下面的代码中假装解决这些问题。 “天哪我们在想什么” 答案是肯定的但是可靠的解决方案还可以指定不检查超类和/或接口指定或排除默认侦听器等。 在我们自己的代码中很少有人会遇到这些情况。 图书馆作家必须担心它们但是我们可以从最基本的假设开始并仅在需要时添加它们。 import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.LinkedHashMap; import java.util.List; import java.util.Map;import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.persistence.Entity; import javax.persistence.EntityManagerFactory; import javax.persistence.PostLoad; import javax.persistence.PostPersist; import javax.persistence.PostRemove; import javax.persistence.PostUpdate; import javax.persistence.PrePersist; import javax.persistence.PreRemove; import javax.persistence.PreUpdate;import org.apache.log4j.Logger; import org.hibernate.SessionFactory; import org.hibernate.ejb.HibernateEntityManagerFactory; import org.hibernate.event.service.spi.EventListenerRegistry; import org.hibernate.event.spi.PostDeleteEvent; import org.hibernate.event.spi.PostDeleteEventListener; import org.hibernate.event.spi.PostInsertEvent; import org.hibernate.event.spi.PostInsertEventListener; import org.hibernate.event.spi.PostLoadEvent; import org.hibernate.event.spi.PostLoadEventListener; import org.hibernate.event.spi.PostUpdateEvent; import org.hibernate.event.spi.PostUpdateEventListener; import org.hibernate.event.spi.PreDeleteEvent; import org.hibernate.event.spi.PreDeleteEventListener; import org.hibernate.event.spi.PreInsertEvent; import org.hibernate.event.spi.PreInsertEventListener; import org.hibernate.event.spi.PreUpdateEvent; import org.hibernate.event.spi.PreUpdateEventListener; import org.hibernate.internal.SessionFactoryImpl;/*** Adapter that allows a Hibernate event listener to call a standard JPA* EntityListener.* * For simplicity only a single bean of each class is supported. It is not* difficult to support multiple beans, just messy.* * Each listener can have multiple methods with the same annotation.* * author Bear Giles bgilescoyotesong.com*/ public class HibernateListenersAdapter implements PostInsertEventListener, PreInsertEventListener,PreUpdateEventListener, PostUpdateEventListener, PreDeleteEventListener, PostDeleteEventListener,PostLoadEventListener {private static final long serialVersionUID 1L;private static final Logger log Logger.getLogger(HibernateListenersAdapter.class);Resourceprivate ListObject listeners;Resourceprivate EntityManagerFactory emf;private MapClass, MapMethod, Object preInsert new LinkedHashMapClass, MapMethod, Object();private MapClass, MapMethod, Object postInsert new LinkedHashMapClass, MapMethod, Object();private MapClass, MapMethod, Object preUpdate new LinkedHashMapClass, MapMethod, Object();private MapClass, MapMethod, Object postUpdate new LinkedHashMapClass, MapMethod, Object();private MapClass, MapMethod, Object preRemove new LinkedHashMapClass, MapMethod, Object();private MapClass, MapMethod, Object postRemove new LinkedHashMapClass, MapMethod, Object();private MapClass, MapMethod, Object postLoad new LinkedHashMapClass, MapMethod, Object();private EventListenerRegistry registry;PostConstructpublic void findMethods() {for (Object listener : listeners) {findMethodsForListener(listener);}HibernateEntityManagerFactory hemf (HibernateEntityManagerFactory) emf;SessionFactory sf hemf.getSessionFactory();registry ((SessionFactoryImpl) sf).getServiceRegistry().getService(EventListenerRegistry.class);}public void findMethodsForListener(Object listener) {Class? c listener.getClass();for (Method m : c.getMethods()) {if (Void.TYPE.equals(m.getReturnType())) {Class?[] types m.getParameterTypes();if (types.length 1) {// check for all annotations now...if (m.getAnnotation(PrePersist.class) ! null) {if (!preInsert.containsKey(types[0])) {preInsert.put(types[0], new LinkedHashMapMethod, Object());}preInsert.get(types[0]).put(m, listener);}if (m.getAnnotation(PostPersist.class) ! null) {if (!postInsert.containsKey(types[0])) {postInsert.put(types[0], new LinkedHashMapMethod, Object());}postInsert.get(types[0]).put(m, listener);}if (m.getAnnotation(PreUpdate.class) ! null) {if (!preUpdate.containsKey(types[0])) {preUpdate.put(types[0], new LinkedHashMapMethod, Object());}preUpdate.get(types[0]).put(m, listener);}if (m.getAnnotation(PostUpdate.class) ! null) {if (!postUpdate.containsKey(types[0])) {postUpdate.put(types[0], new LinkedHashMapMethod, Object());}postUpdate.get(types[0]).put(m, listener);}if (m.getAnnotation(PreRemove.class) ! null) {if (!preRemove.containsKey(types[0])) {preRemove.put(types[0], new LinkedHashMapMethod, Object());}preRemove.get(types[0]).put(m, listener);}if (m.getAnnotation(PostRemove.class) ! null) {if (!postRemove.containsKey(types[0])) {postRemove.put(types[0], new LinkedHashMapMethod, Object());}postRemove.get(types[0]).put(m, listener);}if (m.getAnnotation(PostLoad.class) ! null) {if (!postLoad.containsKey(types[0])) {postLoad.put(types[0], new LinkedHashMapMethod, Object());}postLoad.get(types[0]).put(m, listener);}}}}}/*** Execute the listeners. We need to check the entitys class, parent* classes, and interfaces.* * param map* param entity*/private void execute(MapClass, MapMethod, Object map, Object entity) {if (entity.getClass().isAnnotationPresent(Entity.class)) {// check for hits on this class or its superclasses.for (Class c entity.getClass(); c ! null c ! Object.class; c c.getSuperclass()) {if (map.containsKey(c)) {for (Map.EntryMethod, Object entry : map.get(c).entrySet()) {try {entry.getKey().invoke(entry.getValue(), entity);} catch (InvocationTargetException e) {// log it} catch (IllegalAccessException e) {// log it}}}}// check for hits on interfaces.for (Class c : entity.getClass().getInterfaces()) {if (map.containsKey(c)) {for (Map.EntryMethod, Object entry : map.get(c).entrySet()) {try {entry.getKey().invoke(entry.getValue(), entity);} catch (InvocationTargetException e) {// log it} catch (IllegalAccessException e) {// log it}}}}}}/*** see org.hibernate.event.spi.PostDeleteEventListener#onPostDelete(org.hibernate* .event.spi.PostDeleteEvent)*/Overridepublic void onPostDelete(PostDeleteEvent event) {execute(postRemove, event.getEntity());}/*** see org.hibernate.event.spi.PreDeleteEventListener#onPreDelete(org.hibernate* .event.spi.PreDeleteEvent)*/Overridepublic boolean onPreDelete(PreDeleteEvent event) {execute(preRemove, event.getEntity());return false;}/*** see org.hibernate.event.spi.PreInsertEventListener#onPreInsert(org.hibernate* .event.spi.PreInsertEvent)*/Overridepublic boolean onPreInsert(PreInsertEvent event) {execute(preInsert, event.getEntity());return false;}/*** see org.hibernate.event.spi.PostInsertEventListener#onPostInsert(org.hibernate* .event.spi.PostInsertEvent)*/Overridepublic void onPostInsert(PostInsertEvent event) {execute(postInsert, event.getEntity());}/*** see org.hibernate.event.spi.PreUpdateEventListener#onPreUpdate(org.hibernate* .event.spi.PreUpdateEvent)*/Overridepublic boolean onPreUpdate(PreUpdateEvent event) {execute(preUpdate, event.getEntity());return false;}/*** see org.hibernate.event.spi.PostUpdateEventListener#onPostUpdate(org.hibernate* .event.spi.PostUpdateEvent)*/Overridepublic void onPostUpdate(PostUpdateEvent event) {execute(postUpdate, event.getEntity());}/*** see org.hibernate.event.spi.PostLoadEventListener#onPostLoad(org.hibernate* .event.spi.PostLoadEvent)*/Overridepublic void onPostLoad(PostLoadEvent event) {execute(postLoad, event.getEntity());} }SpringEntityListeners 这种方法要求向HibernateListenersConfigurer bean传递一个显式的bean列表。 我们可以在实体bean上使用注释吗 与标准JPA EntityListeners相比将其称为SpringEntityListeners并将其传递给Bean类。 如果只有一种方法可以获取托管bean列表……。 有 JPA EntityManager提供了一种获取包含所有托管bean的元模型的方法。 我们可以扫描此列表以找到带注释的实体类。 编码 Component public class SpringEntityListenersConfigurer implements ApplicationContextAware {private static final Logger log LoggerFactory.getLogger(SpringEntityListenersConfigurer.class);private ApplicationContext context;Resourceprivate EntityManagerFactory entityManagerFactory;Overridepublic void setApplicationContext(ApplicationContext context) {this.context context;}PostConstructpublic void registerListeners() {// get registry so we can add listeners.HibernateEntityManagerFactory hemf (HibernateEntityManagerFactory) entityManagerFactory;SessionFactory sf hemf.getSessionFactory();EventListenerRegistry registry ((SessionFactoryImpl) sf).getServiceRegistry().getService(EventListenerRegistry.class);final SetObject listeners new HashSetObject();EntityManager entityManager null;try {entityManager hemf.createEntityManager();// for every entity known to the system...for (EntityType? entity : entityManager.getMetamodel().getEntities()) {// ... register event listeners for it.if (entity.getJavaType().isAnnotationPresent(SpringEntityListeners.class)) {SpringEntityListeners annotation (SpringEntityListeners) entity.getJavaType().getAnnotation(SpringEntityListeners.class);for (Class? beanClass : annotation.value()) {MapString, ? map context.getBeansOfType(beanClass);listeners.addAll(map.values());}}}} finally {if (entityManager ! null) {entityManager.close();}}// register adapter and listeners.HibernateEntityListenersAdapter adapter new HibernateEntityListenersAdapter(new ArrayListObject(listeners),entityManagerFactory);registry.getEventListenerGroup(EventType.PRE_INSERT).appendListener(adapter);registry.getEventListenerGroup(EventType.POST_COMMIT_INSERT).appendListener(adapter);registry.getEventListenerGroup(EventType.PRE_UPDATE).appendListener(adapter);registry.getEventListenerGroup(EventType.POST_COMMIT_UPDATE).appendListener(adapter);registry.getEventListenerGroup(EventType.PRE_DELETE).appendListener(adapter);registry.getEventListenerGroup(EventType.POST_COMMIT_DELETE).appendListener(adapter);registry.getEventListenerGroup(EventType.POST_LOAD).appendListener(adapter);} } 可以在http://code.google.com/p/invariant-properties-blog/source/browse/spring-entity-listener中找到代码。 除了简单的记录程序实体侦听器和透明的密码加密实体侦听器之外它还有一个基本的spring-data实现可演示代码。 参考 Invariant Properties博客的JPA 合作伙伴 Bear Giles 在JPA EntityListeners中注入了弹簧注入的Bean 。 翻译自: https://www.javacodegeeks.com/2013/10/spring-injected-beans-in-jpa-entitylisteners.html
http://www.zqtcl.cn/news/798211/

相关文章:

  • 廊坊网站群发关键词怎么在百度上推广自己的公司信息
  • 网站开发 沈阳免费模板建站
  • 商业性质网站建设步骤wordpress电影网盘
  • 网站的外部推广成都房产网官网
  • 深圳网站建设创想营销北京土巴兔全包装修价格表
  • 怎么发布php网站邯郸建设网站制作
  • 手机网站做多宽的图片wordpress顶部导航栏怎么创建
  • 如何做招聘网站的数据分析安徽黄山旅游攻略
  • 2022建站市场国际新闻直播
  • 茗哥网站建设装饰公司网站规划方案
  • 北京天津网站建设公司做平台网站要多久
  • 做我女朋友的表白句的网站做seo_教你如何选择网站关键词
  • 如何对网站用户分析徐州网站制作如何定位
  • 网站定制生成器龙岗网站设计讯息
  • 镇江市建设工程网站蜘蛛爬取网站
  • 个人备案网站可以做电影站吗微信做的地方门户网站
  • 网站上传根目录美点网络公司网站
  • 长春微信做网站网站开发和设计如何合作
  • 江门网站制作报价买网站不给我备案
  • 太原百度网站快速优化网站 后台 数据 下载
  • 某网站开发项目进度表天元建设集团有限公司赵唐元
  • 网站外链收录很多 内链收录几个西安网站seo优化
  • 网站源码制作网站产品类别顺序如果修改
  • 北京定制网站开发公司浩森宇特本机快速做网站
  • 校网站建设方案网站怎么优化关键词快速提升排名
  • 手机号注册的网站wordpress蚂蚁主题
  • 专业的集团网站设计公司优化网站服务
  • 深圳专业网站建设公司好吗个人网站排名欣赏
  • 百度网站流量查询网站建设流程总结
  • 使用代理服务器后看什么网站怎么做动态的实时更新的网站