当前位置: 首页 > 知识库问答 >
问题:

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

方博
2023-03-14

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

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

我用的是阿帕奇骆驼,冬眠,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")

我需要将数据写入表2中,但不确定代码中的位置以及如何写入。感谢您的帮助。如果这个问题已经被问到,请告诉我该链接。

共有2个答案

鄢朝斑
2023-03-14

我找到了解决方案,分享给其他人,让他们在遇到类似情况时也能使用
为实体中的第二个表创建了列

@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");
杨利
2023-03-14

我建议使用一种类似于实时审计如何与Envers协同工作的方法。

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

看看org内部。冬眠事件spi了解详细信息。

 类似资料:
  • 问题内容: 是否可以使用PHP fwrite()将内容附加到.xls文件? 当我使用fwrite()尝试此操作时,生成的文件在Excel 2007中导致错误消息。 我可以使用特定的分隔符来完成此操作吗? 没有第三方库,有可能吗? 问题答案: 您可以使用PhpSpreadsheet库读取现有的Excel文件,向其中添加新的行/列,然后将其写回为真实的Excel文件。 免责声明:我是该库的作者之一。

  • 问题内容: 部署应用程序时,我经常使用Hibernate的功能来创建数据库架构,以简化部署。通过配置hibernate.hbm2ddl.auto属性可以轻松实现。 但是,有时我还需要向数据库中插入一些初始数据,例如root用户。有什么办法可以通过hibernate并加载某种文本文件来实现? 我知道我可以很容易地对将要执行此操作的代码进行编程,但是只是想知道是否已经有一些实用程序可以帮助我通过配置实

  • 问题内容: 我正在循环列表并将其插入数据库中,但它得到的更新记录一个接一个。最后我只在列表中的数据库最后一条记录中看到。 输入名称:Linux,Windows,Mac hibernate.cfg.xml: 这里有3次获得循环并插入数据库。但是以某种方式覆盖了这些值。因为我看到sql插入和更新在控制台中运行。 请帮助我将多个行插入数据库。 问题答案: Hibernate文档中有一章非常好的关于批处理

  • 问题内容: 我正在制作一个混合移动应用程序,我需要存储一些数据,例如,如果它是一个游戏:高分等..到目前为止,它能够使用jquery从JSON文件中读取数据..,但是是否可以写到JSON文件??! 还是有其他方法可以这样做? IDE-Eclipse(插件-IBM Worklight Studio) 只能使用HTML 5以及JS和JQ! 谢谢 (: 问题答案: 您可以将JSON写入本地存储,而只需使

  • 问题内容: 例如,我有一个具有以下内容的文件: 将另一个对象推入此数组以使文件看起来像的JavaScript代码是什么 我要问的原因是我在网上找到了很多有关如何使用AJAX从.json文件中提取数据的信息,但没有使用AJAX将新数据写入.json文件以用其他数据更新.json文件。 任何帮助,将不胜感激! 问题答案: 您必须清楚“ JSON”的含义。 某些人错误地使用术语JSON来指代简单的旧Ja

  • 我正在尝试将以下数据写入csv文件。这些数据是employdetails name1-surname1-place1 名称4-surname4-place4 我希望输出在CSV文件上,一个在另一个下面,在单独的行上。 我写了下面的代码 -KD