目前,我正在开发一个Java EE项目,其中包含有关持久性管理的一些非常重要的要求.用户对实体的更改首先需要在验证之前应用于某个工作副本,然后将它们应用于"实时数据".对实时数据的任何更改也需要有一些记录,以允许审计.
实体通过JPA进行管理,Hibernate将用作提供者.这是一个给定的,所以我们不回避Hibernate特定的东西.对于第一个要求,使用两个持久性单元.一个将实体映射到"实时数据"表,另一个映射到"工作副本"表.对于第二个要求,我们将使用Hibernate Envers,非常适合我们的用例.
到现在为止还挺好.现在,当用户在(基于Web的)前端查看数据时,能够指示工作副本中的哪些字段与实时数据相比更为有用.不同的颜色就足够了.为此,我们需要一些方法来了解哪些属性被改变了.我的问题是,有什么好办法可以解决这个问题?
使用JavaBeans API,PropertyChangeListener可以足以通知工作副本的实体中的任何更改并保留其中的一组.但是该集合也需要持久化,因为应用程序可以重新启动,并且在它们被验证并应用于实时数据之前,更改可以是长期的.并且在每次需要时应用实时数据的变化以获得工作副本是不可行的(因此两个持久性单元).我们还可以将工作副本与实时数据进行比较,并查找不同的字段.一些内省和反射代码就足够了,但这似乎相当于处理密集型,更不用说需要获取实时数据了.也许我错过了一些简单的东西,或者有人知道我可以使用的一个很棒的JPA/Hibernate功能.即使我无法避免制作(a)用于存储此类信息的单独数据库表,直到将其应用于实时数据,但这种方案的一些最佳实践或实际经验可能非常有用.
我意识到这是一个半开放的问题,但肯定其他人一定遇到过这样的要求.任何好的建议都值得赞赏,任何指向现成解决方案的指针都是接受答案的好候选人.
我在项目中使用NHibernate,我需要进行数据审计.我在codeproject上找到了这篇文章,讨论了IInterceptor接口.
您首选的审核数据方式是什么?你使用数据库触发器吗?你是否使用类似于文章中讨论的内容?
我一直在寻找一些使用Entity Framework的审计钩子.其中许多都显示旧的/新的价值比较.这对于审计跟踪非常有用,但我正在寻找快照对象.
例如......假设我有一个管理产品的应用程序.产品具有多个属性和关联的其他对象.假设我将对象更改了10次.我们还要说,重要的是我可以查看这些对象更改的屏幕(不是审计跟踪,而是以只读格式实际显示的屏幕).我感兴趣的是能够为所有这10个更改(取决于我想看到的)检索原始EF产品对象(包含所有相关数据)并使用它来绑定到我的屏幕.
如果我正在使用SQL Server,那么我现在应该为序列化对象使用什么类型(XML,blob等)?这样做有意义吗?
我必须审核一个已经发展了几年的大型Web Java/J2ee应用程序.它是由其他公司编写的,而不是我正在为之工作的公司.在目前的状态下,它变得难以发展和维护,新的功能很难添加,并且经常导致生产中出现的错误.似乎有一些复制/粘贴代码导致代码重复.当前的应用程序是某种在线购物,其中包含一些类似cms的内容.它主要是代码的新部分中的Struts和一些Spring,也许有些ejbs可以用来衡量.有一些单元测试可用,但不是很多.这些是我被告知的事情,我还没有看到实际的代码.
我的公司将提出重写此应用程序部分的建议,以降低复杂性,提高质量和模块性,并且可以在没有回归的情况下添加更简单的新功能.在进行任何通信之前,他们希望对现有代码的质量有所了解并评估其中有多少可以重复使用,以便不必猜测将要做什么 - 完整重写或部分重写.
问题是,我必须在很短的时间内(几天)做到这一点,所以我正在努力制定一个计划,以便在如此短的时间内完成任务.我的意思是:
那么实际的问题是我应该考虑/检查/衡量/等其他什么?
我不确定我可以从中得到什么样的数字,如果它真的意味着什么,我觉得管理层所要求的是一种错误的方法,所以第二个问题是:有没有人有一个更好的主意?
我会感激任何想法,建议,评论.
你知道任何用于审计日志记录的优秀Java库吗?或者至少是好的书/文章,以帮助选择为应用程序构建审计日志的好方法?
库要求:
- 定义通用审计元数据(userId,time,IP,...)
- 定义审计消息类型(发送的事务,收到的消息,......)
- 锁定/签署单个审计消息(用于不可否认)
- 搜索基于元数据的审计日志
- 等
编辑:
我不是在寻找自动化解决方案,我很满意这样的话:
AuditEvent event = new TransactionSentEvent(userId, account, amount, ...)
AuditLog.audit(auditEvent);
Run Code Online (Sandbox Code Playgroud)
重点是拥有基础设施 - 数据库的安全存储,无信誉等.
如何最小化我的请求的cookie大小?Chrome似乎在"警告我"我的饼干大小是41B,这根本不是很多,但它是否有理由警告我呢?
它是一个PHPSESSID cookie,我真的不知道如何最小化.有任何想法吗?
我的请求响应本身应该已经是Gzip,但据我所知,不可能自己压缩标题,或者是否存在?
谢谢!我只是一个关于性能和审核的OCD,告诉我我可以做得更好.
我有一个相当复杂的数据库结构,我正在尝试审核.目前我运行Envers并审核对每个对象所做的更改.这非常有效!
我现在想在UI上显示一些审计信息.对象/表格变得非常复杂,因此我一直在寻找一种方法来查看审计中哪些字段已更改.当前Envers存储标记有修订ID的每个对象的快照.我可以查看每个对象的修订版,然后手动查询以查看已更改的内容,但我想知道是否有一种方法可以Envers存储哪些字段已更改.这可能吗?我从2011年发现了这个链接,它建议手动检查每个对象字段.我关心的是速度.我有很多相关的对象,我可能只有一个更新的字段.我将不得不查询很多字段以找到已更改的字段.
是否可以存储已更改的字段?
谢谢
编辑
我应该说我正在使用REVCHANGES表,所以我可以看到在什么版本中发生了什么变化但是这只是在实体级别而不是字段级别
我正在尝试让Spring Data Auditing在我的Spring 3.2.8/Spring Data 1.5/Hibernate 4项目中运行.
根据Spring Data Auditing文档,我已经@CreatedBy为我的实体添加了等等注释,由AuditorAware实现创建,并在我的JavaConfig中实例化.然而,似乎永远不会开火.
我发现文档有点令人困惑.似乎JavaConfig条目替换了xml条目,但我不确定.
orm.xml我的申请目前没有任何文件.说实话,我甚至不确定在何处/如何配置它,或者为什么我需要它.我的所有实体都在使用注释.我尝试将@EntityListeners(AuditingEntityListener.class)添加到实体,但这没有帮助.
我的当前实体管理器是在没有persistence.xml文件的情况下定义的:
<!-- entity manager -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
<property name="packagesToScan" value="com.ia.domain"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.query.substitutions">true '1', false '0'</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<prop key="hibernate.connection.charSet">UTF-8</prop>
</props>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
JavaConfig:
@Configuration
@EnableJpaAuditing
public class AuditConfig {
@Bean
public AuditorAware<User> auditorProvider(){
return new SpringSecurityAuditorAware();
}
}
Run Code Online (Sandbox Code Playgroud)
实体:
@EntityListeners({AuditingEntityListener.class})
@Entity …Run Code Online (Sandbox Code Playgroud) 我在这个问题上找到了几个讨论主题 - 但没有任何内容在一个主题下对所有三种机制进行了比较.
所以这是我的问题......
我需要审核数据库更改 - 插入\ updates \删除到业务对象.
我可以想到三种方法来做到这一点
1)DB触发器
2)Hibernate拦截器
3)Spring AOP
(这个问题特定于Spring\Hibernate\RDBMS-我猜这对java\c#或hibernate \nhibernate-是中立的 - 但如果你的答案依赖于C++或Java或者hibernate的具体实现 - 请注明)
选择其中一种策略有哪些优缺点?
我不是要求实现细节.-这是一个设计讨论.
我希望我们可以将其作为社区维基的一部分
能够至少扫描一批.js文件以查找eval语句和其他可疑代码的东西.也许只是一个正则表达式模式会做到这一点,但我想找到一个更复杂(和定期维护)的工具.
audit ×10
java ×4
java-ee ×3
hibernate ×2
jpa ×2
browser ×1
c# ×1
cookies ×1
database ×1
javabeans ×1
javascript ×1
nhibernate ×1
performance ×1
properties ×1
security ×1
spring ×1
spring-aop ×1
spring-data ×1
sql-server ×1
versioning ×1