Date Tags Java / JPA

默认的JPA是使用Int, Long来作为ID使用的。但是用这两种型的ID作为 Primarykey有一些不好的地方。

  • 可能会溢出。
  • SqlServer 的identity属性让你的单元测试变得焦头烂额, 因为你初始化数据库的时候总可能出现

    Cannot insert explicit value for identity column,
    

    这是由于你对ID附上值了。 * 如果存在一个老系统,他的主键不是数字型,而是自己定义的varchar 或char类型的话就会有问题。

这里我将讲述如何使用String作为@Id, 但我不用annotation的方式去配置。而是用xml定义方式。

如下例, 数据库的表结构如下

CREATE TABLE questions (
    question_id VARCHAR(15) primary key,
    description VARCHAR(30)
);

xml定义如下

<entity class="Question" metadata-complete="true">
    <table name="questions" />
    <attributes>
        <id name="questionId">
            <column name="question_id" />
            <!-- 
            <generated-value/>
             -->
        </id>
        <basic name="description">
            <column name="description" />
        </basic>
    </attributes>
</entity>

注意: id的节点下面不能有 generated-value 这个子节点,不然会出现如下错误

Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.example.domain.Question