java如何桥接JAXB类和DAO使用的POJO(域对象)?
我希望使用与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...
}
数据库Util:
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:操作数堆栈上的类型错误。不幸的是,我没有能力实现一个可以轻松实现这一点的新框架
# 1 楼答案
除了分离这两层之外,似乎没有其他答案。我使用Dozer将JAXB和POJO相互映射。该框架还实现了到POJO的直接JAXB bean映射