2017-02-15 1 views
0

Я вставляю данные в таблицу SQL Server. Во время вставки мне нужно проверить, обновляется ли какая-либо существующая строка, а затем обновлять другую таблицу, в которой этот столбец обновляется. Для экс:
Table1: Новая строка вставляется A1 и строки обновляются A2
Table2: две строки должны быть созданыКак записать данные в таблицу после hibernate @EntityListener с помощью Camel JPA

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

Я использую Apache верблюдицу, спящий режим, 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(); 
    } 
} 

верблюд 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

Я нашел решение, разделяющее его, чтобы другие могли использовать, если они застряли в подобном сценарии.
создал колонки для второй таблицы в сущности

@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"); 
0

Я рекомендую использовать подход, похожий на то, как аудит в режиме реального времени работает с Envers.

Что вы делаете, так это регистрировать различные реализации PostXXXEventListener в соответствии с вашими потребностями, и затем эти слушатели сохраняют новые объекты на основе текущего обрабатываемого действия.

За дополнительной информацией обратитесь к org.hibernate.event.spi.

Смежные вопросы