我需要为我的Java Web App 制作一个审计模块.我使用EclipseLink,而不是Hibernate(不能使用Envers).我搜索了很多方法来获取JPA正在执行的SQL或JPQL,所以我可以记录这样的事情:
System.out.println("User " + user + " from " + ip_address + " executed " + jpa_statement + " at " + new Date());
Run Code Online (Sandbox Code Playgroud)
实际上,我会将此信息保存到历史数据库的表中.因此,我可以随时轻松检索此信息.这就是为什么" SHOW SQL "参数对我来说还不够.我真的需要SQL字符串,所以我可以在我的源代码中操作它.
我在JPA spec中找到了EntityListener功能,并认为它是放置我的日志代码的最佳位置.例如,postUpdate方法可以记录对象更新的时间.但我的问题是我不能执行SQL.
这是我的意思的一个例子:
public class AuditListener {
@PostUpdate
public void postUpdate(Object object) {
User user = (User)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");
String ip_address = (User)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("ip_address");
String jpa_statement = object.getSQL();
System.out.println("User " + user + " from " + ip_address + " executed " + jpa_statement + " at " + …Run Code Online (Sandbox Code Playgroud) 即使我禁用缓存,我也会使用JPA获取旧数据.我想是因为资源配置为RESOURCE_LOCAL,但我不确定.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="AppPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>com.myentities.User</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/mydatabase"/>
<property name="javax.persistence.jdbc.password" value="*****"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="user1"/>
<property name="eclipselink.logging.level" value="FINEST"/>
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
我的代码获取有关用户的旧信息:
public List<User> findAll(App app) {
getEntityManager().getTransaction().begin();
Query q = getEntityManager().createQuery("SELECT t1 FROM User t1 WHERE t1.app.idApp=:idApp");
q.setParameter("idApp", app.getIdApp());
getEntityManager().flush();
getEntityManager().getTransaction().commit();
List resultList = q.getResultList();
return resultList;
}
Run Code Online (Sandbox Code Playgroud)
我的实体:
@Entity
@Table(name = "user")
@Cache (
type=CacheType.NONE
)
public class User implements Serializable {
// some attributtes …Run Code Online (Sandbox Code Playgroud) Netbeans最强大的功能之一是使用一些FreeMarker模板生成代码.我对此有一些疑问,我希望有人可以帮助我.
如何在Netbeans上创建一个不仅仅生成1个文件的模板?
例如,我使用"JSF Pages From Entity Beans"向导生成CRUD文件.因此它为我拥有的每个实体自动创建4个文件:
- Create.xhtml
- Edit.xhtml
- List.xhtml
- View.xhtml
Run Code Online (Sandbox Code Playgroud)
这非常有用,因为您经常需要创建,编辑,列出或查看数据库中的某些记录.所以我知道我可以通过单击工具 - >模板 - > JavaServer Faces - > JSF实体 - > View.xhtml单独编辑每个模板.然后我可以改变View.xhtml的生成方式.然后在"C:\ Users\yourname\.netbeans\6.9\config\Templates\JSF\JSF_From_Entity_Wizard\view.ftl"上创建一个FTL文件.
但我想要更多,我还需要一个搜索页面.我的问题是我如何制作或更改像"JSF Pages From Entity Beans"这样的模板,它不仅生成1个文件,而且每个实体生成4个文件.所以我可以更改此模板以生成5个文件:
- Create.xhtml
- Edit.xhtml
- List.xhtml
- View.xhtml
- Search.xhtml (for example)
Run Code Online (Sandbox Code Playgroud)
提前致谢!
eclipselink ×2
java ×2
jpa ×2
audit ×1
freemarker ×1
jsf ×1
netbeans ×1
show-sql ×1
templates ×1