我将数据插入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但不确定代码中的位置以及如何编写。任何帮助表示赞赏。如果已经提出这个问题,请将我引导至该链接。
答案 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");