小编And*_*dré的帖子

如何在没有Hibernate Envers的情况下审核JPA

我需要为我的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)

audit jpa eclipselink entitylisteners show-sql

12
推荐指数
2
解决办法
8135
查看次数

使用JPA获取旧数据

即使我禁用缓存,我也会使用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)

java jpa eclipselink

6
推荐指数
1
解决办法
1万
查看次数

如何使Netbeans的模板创建多个文件?

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)

提前致谢!

java jsf templates netbeans freemarker

6
推荐指数
1
解决办法
3881
查看次数