자바 기반 웹 응용 프로그램을 디버깅하고 있습니다. 이 여러 레코드가 테이블에 삽입 된 우리의 생산 환경에서보고 된 문제이지만, 다른 기록은Oracle/Java가 한 번에 여러 레코드를 생성하는 이유는 무엇입니까?
생산 문제의 결과가 유효하지 않습니다 : HDR_COL1 HDR_COL1 HDR_NO
헤더 테이블
DOCUMENT_DATE
HDR44 2014년 6월 6일 14시 22분
HDR45 68 327 2014년 6월 6일 14 : 24 - 잘못된 데이터
68 HDR46 6/6/2014 14:24 - 잘못된 데이터
개 상세 표
DTL_NO HDR_NO DTL_COL1 DTL_COL1
DTL76 HDR44 SR1439 4337
DTL77 HDR45 SR1439 4337 - 유효하지 않은 데이터
DTL78 HDR46 SR1439 4337 3,694,783,210 - 유효하지 않은 데이터
생산 문제 결과 :
(예상 결과 : 각 테이블에 단 하나 개의 기록).
로컬 환경에서 3 개의 연속적인 httpservletrequest를 보내이 문제를 재현하려고했습니다.
ID와 동일한 HDR_NO를 사용하는
헤더의 세 인스턴스를 삽입하려고했기 때문에 두 개의 요청이 필터링에서 필터링되었습니다.
테스트시 각 테이블에 하나의 레코드가 삽입되었습니다. 내 질문은 지금,이 버그의 원인은 무엇입니까?
내 코드는 아래 코드와 같습니다. 도와주세요. 그것은 당신이 "검증"을 어떻게하고 귀하의 질문에 명확하지 않다, 그러나 데이터베이스 중복을 수 있기 때문에이 검증은 응용 프로그램 계층에서 수행되고 있음을 시사하고
public class MyController extends SimpleFormController{
public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response,Object
private MyService myService
command, BindException errors){
BeanParam bean = buildBeanParam(request);
myService.doTransaction(bean);
}
}
public class MyService{
public void doTransaction(BeanParam bean){
try{
List Item items = getItems(bean);// query with one result
Header header = createHeader();//mysterious bug occur
populateDetails(header, items);//mysterious bug occur
} catch (GenerateIdException e) {
e.printStackTrace();
}
}
public Header createHeader(){
Header header = new Header();
// generates a number with common prefix
header.setHeaderNo(headerNumberGenerator());
header.setDocumentDate(new Date());
header.setHdrcol1("String 1");
header.setHdrcol2("String 2");
return headerDao.save(header);
}
public void populateDetails(Header header, List;Item; items){
for(Item item: items){
//items.size() == 1, so one record in Detail Table is expected
Detail detail = new Detail();
// generates a number with common prefix
detail.setDetailNo(detailNumberGenerator());
detail.setDocumentDate(new Date());
detail.setDtlcol1(item.getField1());
detail.setDtlcol2(item.getField2());
detail.setHeader(header);
detailDao.save(detail);
}
}
}
public class Header{
@Id
@Column(name = "HDR_NO", length = 20)
private String headerNo;
@Temporal(TemporalType.DATE)
@Column(name = "DOCUMENT_DATE")
private Date documentDate;
@Column(name = "HDR_COL1")
private String hdrcol1;
@Column(name = "HDR_COL2")
private String hdrcol2;
@OneToMany(mappedBy = "header")
@Cascade(value = { CascadeType.PERSIST, CascadeType.MERGE })
private List Details details;
//Getters and Setters
}
public class Details{
@Id
@Column(name = "DTL_NO")
private String detailNo;
@ManyToOne
@JoinColumn(name = "HDR_NO", referencedColumnName = "HDR_NO")
private Header header;
@Column(name = "DTL_COL1")
private String dtlcol1;
@Column(name = "DTL_COL2")
private String dtlcol2;
//Getters and Setters
}
public class Item{
@Column(name = "FIELD1")
private field1;
@Column(name = "FIELD2")
private field2;
//Getters and Setters
}
예 ... 로컬 환경에서 이것을 복제 할 수 없습니다 ... – dolf
원격 디버깅을 할 수 있습니까? – user75ponic
사용자가 제공 한 단계를 따르면이 문제가 발생할 가능성은 거의 없습니다. 불안정한 DB 연결로 인해이 버그가 발생할 가능성이 있습니까? – dolf