簡體   English   中英

如何將XMLParse與JPA結合使用

[英]How persist using XMLParse with JPA

我有一個XML Parse作為示例,我是在通道代碼Java的互聯網上獲取的:

public class Example{

public void getParserXML(String f){

獲取並配置SAX basead解析器

SAXParserFactory factory = SAXParserFactory.newInstance();

獲取SAX解析器的對象

SAXParser saxp = null;
try {
     saxp = factory.newSAXParser();
    } catch (ParserConfigurationException ex) {
     Logger.getLogger(Example.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SAXException ex) {
      Logger.getLogger(Example.class.getName()).log(Level.SEVERE, null, ex);
    }

SAX處理程序類的默認處理程序,所有三種方法都寫在處理程序的主體中

    DefaultHandler handler;
    handler = new DefaultHandler(){
    boolean bnamePerson = false;
    boolean bagePerson = false;

    String namePerson, agePerson;

    PersonEntity personEnt = new PersonEntity();
    CallPersist callPer = new CallPersist();

每次解析器獲取打開標簽'<'時,都會通過調用打開標志來標識哪個標簽正在打開,從而調用此方法

Public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException{
    if(qName.equalsIgnoreCase("namePerson")){
       bnamePerson = true;
      }
    if(qName.equalsIgnoreCase("agePerson")){
       bagePerson = true;
      }                
    }            

Public void endElement(String uri, String localName, String qName) throws SAXException{

        }

打印存儲在'<'和'>'標簽之間的數據

Public void characters(char ch[], int start, int lenght)throws SAXException{

    if(bnamePerson){                    
       System.out.println("Name Person is "+new String(ch, start, lenght));
       namePerson = new String(ch, start, lenght); 
       personEnt.setName(namePerson);
       bnamePerson = false;
    }
    if(bagePerson){
       System.out.println("Age is "+new String(ch, start, lenght));
       agePerson = new String(ch, start, lenght); 
       personEnt.setAge(agePerson);
       bagePerson = false;
    }  
       callPer.persistPerson(personEnt); 
    }     
    }; 

    try {
        saxp.parse(f, handler);
    } catch (SAXException ex) {
        Logger.getLogger(Example.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Example.class.getName()).log(Level.SEVERE, null, ex);
    }
}   

}

函數CallPersist具有以下功能:

public void persistPerson(PersonEntity personEnt){
    EntityManager em = EntityManagerHelper.getEntityManager();

    em.getTransaction().begin();
    em.getTransaction().commit();
    em.persist(personEnt);
    em.clear();

    em.close(); 

    }   

筆記:

  • 對於JPA不會返回原子性錯誤,我手動輸入了ID。

  • 程序正常執行,但數據不持久。

解決這個問題的正確方法是什么?

事務調用的順序錯誤。

它應該是:

public void persistPerson(PersonEntity personEnt){
    EntityManager em = EntityManagerHelper.getEntityManager();

    em.getTransaction().begin();
    em.persist(personEnt);
    em.getTransaction().commit();

    em.clear();
    em.close(); 
}   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM