[英]How should I bridge a JAXB class and a POJO (domain object) used by a DAO?
我想使用與JAXB類相同的類以及DAO的域對象。 這樣,我可以輕松地將數據從傳入/傳出XML Web服務調用中來回移動,以直接在數據庫上進行CRUD事務。 有沒有可以使用的設計模式? 我傾向於AbstractFactory,因為我有一些數據庫util函數可以准備SQL參數,而不必知道表/列名稱。
@XmlRootElement( name = "labdata")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "labdata", propOrder = {"labId",
"labDesc",
"lastUpdateDatetime",
"userId"})
public class LabData extends DbObject
{
@XmlTransient
private HashMap<String, Object> mappedFields;
@XmlElement(name="lab_id", required = true)
private Integer labId;
@XmlElement(name="lab_desc", required = true)
private String labDesc;
@XmlElement(name="last_altered_dt", required = true)
private Timestamp lastUpdateDatetime;
@XmlElement(name="user_id", required = true)
private String userId;
@XmlTransient
private final String labIdField = "TST_LAB_CD";
@XmlTransient
private final String labDescField = "LAB_DSC_TE";
@XmlTransient
private final String lastUpdateDatetimeField = "INS_GMT_TS";
@XmlTransient
private final String userIdField = "USR_ID";
@XmlTransient
private final String tableName = "TSTLAB";
/**
* Default constructor.
*/
public LabData() {
super();
mappedFields = new HashMap<String, Object>();
}
/**
* Constructor which takes all fields as parameters
* and will update the protected hash map after setting all the fields.
* @param labId {@link Integer}
* @param labDesc {@link String}
* @param lastUpdateDatetime {@link Timestamp}
* @param userId {@link String}
*/
public LabData(Integer labId, String labDesc, Timestamp lastUpdateDatetime, String userId) {
super();
this.labId = labId;
this.labDesc = labDesc;
this.lastUpdateDatetime = lastUpdateDatetime;
this.userId = userId;
updateHashMap();
}
public Object[] getFieldValues() {
return new Object[] {this.labId, this.labDesc, this.lastUpdateDatetime, this.userId};
}
public Object[] getUpdateFieldValues() {
return new Object[] {this.labDesc, this.lastUpdateDatetime, this.userId};
}
public void updateHashMap() {
mappedFields.clear();
mappedFields.put(this.labIdField, this.labId);
mappedFields.put(this.labDescField, this.labDesc);
mappedFields.put(this.lastUpdateDatetimeField, this.lastUpdateDatetime);
mappedFields.put(this.userIdField, this.userId);
}
getters and setters...
}
數據庫實用程序:
public List<Object[]> createInsertBatchArgs(DbObject[] dbPojos){
List<Object[]> args = new ArrayList<Object[]>();
for(DbObject dbPojo: dbPojos) {
args.add(dbPojo.getFieldValues());
}
return args;
}
public List<Object[]> createUpdateBatchArgs(DbObject[] dbPojos, String... updateFields){
List<Object[]> args = new ArrayList<Object[]>();
for(DbObject dbPojo: dbPojos) {
Object[] fields = dbPojo.getUpdateFieldValues();
Object[] values = Arrays.copyOf(fields, fields.length+updateFields.length);
for(int i = 0; i < updateFields.length; i++) {
values[values.length-updateFields.length+i] =
dbPojo.getFieldValue(updateFields[i]);
}
args.add(values);
}
return args;
}
public List<Object[]> createDeleteBatchArgs(DbObject[] dbPojos, String... deleteFieldName){
List<Object[]> args = new ArrayList<Object[]>();
Object[] values = new Object[deleteFieldName.length];
for(DbObject dbPojo: dbPojos) {
for(int i = 0; i < deleteFieldName.length; i++) {
values[i] = dbPojo.getFieldValue(deleteFieldName[i]);
}
args.add(values);
}
return args;
}
如果刪除DbObject繼承,則通過強制轉換DAO方法的使用會導致java.lang.VerifyError:操作數堆棧上的類型錯誤。 不幸的是,我沒有能力實現一個容易做到這一點的新框架。
在分離兩層之外似乎沒有答案。 我使用推土機將JAXB和pojos相互映射。 該框架還具有直接JAXB bean映射到pojos的實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.