JPA Dead Lock 死锁

使用JTA + hibernate 做持久层,Unitils 做Repository的单元测试。

Test类中的repository是用Unitils 提供的@SpringBean进行注入。 而repository中的entityManager是用@PersistenceContext的方式注入, 这个注入是由spring来管理的,所以repository的实现类中的entityManager 的datasource是属于spring的。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

然而 ...

more ...

OpenJPA Entity

出现下列错误

Caused by: <openjpa-2.2.0-r422266:1244990 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: This configuration disallows runtime optimization, but the following listed types were not enhanced at build time or at class load time with a javaagent: "
com.example.jpastudy.Message".

解决方法1, 在persistence.xml中添加

<property name="openjpa.RuntimeUnenhancedClasses ...
more ...

JPA 中如何使用String 类型作为Identity

默认的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 ...
more ...