如何使用Camel JPA在hibernate @EntityListener操作后将数据写入表中

时间:2017-02-15 20:48:01

标签: java hibernate jpa apache-camel

我将数据插入SQL Server表。在插入期间,我需要检查是否有任何现有行正在更新,然后更新另一个表写入哪个列更新。例如:
表1:新行插入A1,行更新A2
表2:应创建两行

<Old Value> <New Value> <Unique Key>
""            A1              PK1    --for insert
"Dummy Val"   A2              PK2    --for update

我正在使用Apache-camel,hibernate,jpa

插入数据的主表:

@Entity(name = "tableName")
@EntityListeners(value = updateEntityListener.class)
public class ExampleTable{

    @Column(name = "col1")
    private int col1;
    //getter setter
    @Override
    public String toString() {
        return "data";
    }

监听

import javax.persistence.PostLoad;
import javax.persistence.PostPersist;
import javax.persistence.PostUpdate;

public class updateEntityListener{
    private String preUpdate = "";
    private String postUpdate = "";

    @PostPersist
    public void postPersist(final ExampleTable ex) {
//Insert data in another table
        System.out.println("Row inserted");
    }

    @PostUpdate
    public void postUpdate(final ExampleTable ex) {
        postUpdate = ex.toString();
        if (!preUpdate.equals(postUpdate)) {
            System.out.println("Row Updated");
            // Insert in new table, compare from postLoad
        }
    }
    @PostLoad
    public void postLoad(final ExampleTable ex) {
        preUpdate = ex.toString();
    }
}

camel Builder(Java DSL)

from("timer:invoke?repeatCount=1")
        .log("Processing ${id}")
        .toD("https4://URL")
        .inheritErrorHandler(true)
        .unmarshal()
        .json(JsonLibrary.Jackson)
        .split(body())
        .parallelProcessing()
        .process(new MyProcessor())
        .to("jpa:ExampleTable")

我需要将数据写入table2但不确定代码中的位置以及如何编写。任何帮助表示赞赏。如果已经提出这个问题,请将我引导至该链接。

2 个答案:

答案 0 :(得分:0)

我建议使用一种方法,就像实时审核如何与Envers一起使用。

您所做的是注册各种PostXXXEventListener实现以满足您的需求,然后让这些侦听器根据当前正在处理的操作保留新实体。

查看org.hibernate.event.spi内部了解详情。

答案 1 :(得分:0)

我找到了解决方案,共享以便其他人可以使用,如果陷入类似的情况。
为实体

中的第二个表创建列
@Entity(name = "tableName")
@EntityListeners(value = updateEntityListener.class)
public class ExampleTable{

    @Column(name = "col1")
    private int col1;
    @Transient
    private List<Table2> auditInfo = new ArrayList<Table2>();
    //getter setter
    @Override
    public String toString() {
        return "data";
    }

听众改变:

import javax.persistence.PostLoad;
import javax.persistence.PostPersist;
import javax.persistence.PostUpdate;

public class updateEntityListener{
    private String preUpdate = "";
    private String postUpdate = "";

    @PostPersist
    public void postPersist(final ExampleTable ex) {
//Insert data in another table
ex.setAuditInfo(new Object()); //Actual object instead of new Object()
        System.out.println("Row inserted");
    }

    @PostUpdate
    public void postUpdate(final ExampleTable ex) {
        postUpdate = ex.toString();
        if (!preUpdate.equals(postUpdate)) {
            System.out.println("Row Updated");
            // Insert in new table, compare from postLoad
            ex.setAuditInfo(new Object()); 
        }
    }
    @PostLoad
    public void postLoad(final ExampleTable ex) {
        preUpdate = ex.toString();
    }
}

最后构建器更改:

from("timer:invoke?repeatCount=1")
        .log("Processing ${id}")
        .toD("https4://URL")
        .inheritErrorHandler(true)
        .unmarshal()
        .json(JsonLibrary.Jackson)
        .split(body())
        .parallelProcessing()
        .process(new MyProcessor())
        .to("jpa:ExampleTable")
        .process(new Processor() {
                public void process(Exchange arg0) throws Exception {
                    List<Table2> info= ((ExampleTable) arg0.getIn().getBody()).getAuditInfo();
                    if (null != info&& info.size() > 0) {
                        arg0.getIn().setBody(info);
                    }else{
                        arg0.getIn().setBody(new ArrayList<Table2>());
                    }

                }
            })
            .to("jpa:Table2?entityType=java.util.ArrayList");