在Hibernate <generator>标签中使用param有什么用?</generator>

时间:2014-01-09 02:49:43

标签: java hibernate

我是Hibernate的新手,在我目前的项目hibernate配置文件中,我发现了一些如下代码:

<id name="id" column="ANNOBATCHJOBLOGID">
    <generator class="sg.gov.frontier.core.techinfra.persistence.dao.SequenceGeneratorYYYYMMDD">
        <param name="sequence">ANNO_BATCH_JOB_LOG_SEQ</param>
    </generator>
</id>
只是对param标签感到困惑,有人能告诉我它有什么用吗?还有“ANNO_BATCH_JOB_LOG_SEQ”。非常感谢

SequenceGeneratorYYYYMMDD类在这里:

public class SequenceGeneratorYYYYMMDD extends SequenceGenerator {
    protected Logger logger = Logger.getLogger(SequenceGeneratorYYYYMMDD.class);
    public String sequenceName;
    public String parameters;

    public static final long SEQUENCE_MIN_NUMBER = 1;
    public static final long SEQUENCE_MAX_NUMBER = 999999;
    public static final long SEQUENCE_INCREMENT_NUMBER = 1;
    public static final long SEQUENCE_START_NUMBER = 1;

    public SequenceGeneratorYYYYMMDD() {
        super();
    }

    public long getNextSequenceForSequenceName(String strSequenceName)
            throws DataAccessObjectException {
        final SequenceDao sequenceDao = new SequenceDao();

        Long sequence = sequenceDao.getNextKey(strSequenceName);

        return sequence;
    }

    public void configure(Type type, Properties params, Dialect dialect)
            throws MappingException {
        this.sequenceName = getString(SEQUENCE, params, "hibernate_sequence");
        this.parameters = params.getProperty(PARAMETERS);
        String schemaName = params.getProperty(SCHEMA);
        String catalogName = params.getProperty(CATALOG);

        if (sequenceName.indexOf('.') < 0) {
            sequenceName = Table.qualify(catalogName, schemaName, sequenceName);
        }

    }

    public String getString(String property, Properties properties,
            String defaultValue) {
        String propValue = properties.getProperty(property);
        return propValue == null ? defaultValue : propValue;
    }

    public Serializable generate(SessionImplementor session, Object obj)
            throws HibernateException {

        String result = DateUtil.convertDateToDateString(new DateTime(),
                "yyMMddHH");

        try {
            result = result
                    + StringUtil
                            .leftPad(
                                    String.valueOf(getNextSequenceForSequenceName(sequenceName)),
                                    '0', 8);
        } catch (DataAccessObjectException e) {
            throw new HibernateException(e.getMessage(), e.getCause());
        }

        logger.debug("Generated sequence no. " + result);
        return new Long(result);

    }
}

我怎么知道我需要通过哪种方法传递参数?虽然看起来是getNextSequenceForSequenceName()方法。

1 个答案:

答案 0 :(得分:0)

来自Hibernate docs 5.1.4.1. Generator

  

可选的<generator>子元素命名一个Java类,用于为持久化类的实例生成唯一标识符。 如果需要任何参数来配置或初始化生成器实例,则使用<param>元素传递它们。

<id name="id" type="long" column="cat_id">
    <generator class="org.hibernate.id.TableHiLoGenerator">
            <param name="table">uid_table</param>
            <param name="column">next_hi_value_column</param>
    </generator>
</id>