All Downloads are FREE. Search and download functionalities are using the official Maven repository.

sf.database.meta.OptimisticLock Maven / Gradle / Ivy

The newest version!
package sf.database.meta;

import sf.core.DBField;
import sf.core.DBObject;
import sf.database.dao.DBContext;
import sf.database.dialect.DBDialect;
import sf.database.jdbc.sql.Crud;
import sf.database.jdbc.sql.SQLContext;
import sf.database.jdbc.sql.SQLParameter;
import sf.database.util.DBUtils;
import sf.database.util.OrmUtils;
import sf.database.util.OrmValueUtils;
import sf.database.util.SQLUtils;
import sf.spring.util.CollectionUtils;
import sf.tools.StringUtils;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 乐观锁支持
 * @see javax.persistence.Version
 */
public class OptimisticLock {
    /**
     * @param conn
     * @param obj
     * @param 
     * @see javax.persistence.Version
     * 从数据库中获取最新的乐观锁的值到对象中,一般情况下,该方法用不到.慎用.
     */
    public static  void setNewOptimisticLockValues(Connection conn, T obj) {
        TableMapping table = MetaHolder.getMeta(obj.getClass());
        DBDialect dialect = DBUtils.doGetDialect(conn, false);
        DBContext dbContext = DBUtils.doGetDBContext(conn);
        List fStr = new ArrayList<>();
        if (!CollectionUtils.isEmpty(table.getVersionMap())) {
            for (Map.Entry e : table.getVersionMap().entrySet()) {
                ColumnMapping cm = e.getValue();
                String columnName = cm.getRawColumnName();
                fStr.add(dialect.wrapKeyword(columnName));
            }
            String tableName = dialect.wrapKeyword(OrmUtils.getDynamicTableName(dbContext, table));
            SQLContext c = new SQLContext(table);
            List pKeys = table.getPkFields();
            List parameters = new ArrayList<>();
            StringBuilder sql = new StringBuilder();
            sql.append("select ").append(StringUtils.join(fStr, ",")).append(" from ").append(tableName);
            boolean f = false;
            for (ColumnMapping pk : pKeys) {
                sql.append(f ? " and " : " where ").append(dialect.wrapKeyword(pk.getRawColumnName())).append(" = ").append(SQLUtils.placeholder());
                Object value = OrmValueUtils.getValue(obj, pk);
                parameters.add(new SQLParameter(value, pk));
                f = true;
            }
            c.setSql(sql.toString());
            c.setParas(parameters);

            DBObject temp = Crud.getInstance().getCrudModel().selectOne(conn, obj.getClass(), c);
            if (temp != null) {
                //设置最新的版本值到obj对象中
                for (Map.Entry e : table.getVersionMap().entrySet()) {
                    ColumnMapping cm = e.getValue();
                    Object value = OrmValueUtils.getValue(temp, cm);
                    OrmValueUtils.setValue(obj,cm,value);
                }
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy