[英]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.