如何桥接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:操作数堆栈上的坏类型。不幸的是,我没有能力实现一个新的框架,可以很容易地做到这一点。

除了将这两层分开,似乎没有别的答案。我使用Dozer将JAXB和pojo相互映射。这个框架还实现了直接将JAXB bean映射到pojo。

最新更新