簡體   English   中英

我應該如何橋接JAXB類和DAO使用的POJO(域對象)?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM