【发布时间】:2013-08-30 09:14:06
【问题描述】:
我的 SQL Server 数据库中有一个表,其中主键字段定义为 NEWID() 作为默认值。期望客户端不需要传递主键字段值,SQL Server 会处理它。
在 JPA 定义我的模型类时,我必须用生成类型定义这个 ID 字段。我试过IDENTITY、TABLE 和SEQUENCE 发电机。不幸的是,我收到了一个错误
Exception Description: Error preallocating sequence numbers.
The sequence table information is not complete..
我的坚持。 XML如下
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="LOB_Webservice" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>com.xyz.lob.model.jpa.OrderDetail</class>
<class>com.xyz.lob.model.jpa.OrderHeader</class>
<shared-cache-mode>NONE</shared-cache-mode>
<properties>
<property name="jboss.as.jpa.providerModule" value="org.eclipse.persistence"/>
<property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost:1433;databaseName=LOB_INT" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="*******" />
<property name="eclipselink.logging.level" value="FINE"/>
<property name="eclipselink.sharedCache.mode" value="None"/>
<property name="eclipselink.jdbc.cache-statements" value="false" />
<property name="eclipselink.query-results-cache" value="false"/>
<property name="eclipselink.logging.exceptions" value="true"/>
<property name="eclipselink.weaving" value="static"/>
</properties>
</persistence-unit>
我的模型类如下
@Entity
public class OrderHeader implements Serializable {
@Id
@Basic(optional = false)
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="OrderId")
private String orderId;
...
}
【问题讨论】:
-
您需要使用像 Identity 这样的东西,因为其他策略让 JPA 在插入语句中查找并分配序列号,而 Identity 允许它在插入后从数据库中获取值。有关简单示例,请参阅wiki.eclipse.org/EclipseLink/Examples/JPA/…,并显示您在使用 IDENTITY 时遇到的完整错误。您也可以尝试将数据库平台指定为使用正确的用户:eclipse.org/eclipselink/documentation/2.4/jpa/extensions/…
-
对不起,上面的评论没有意识到 NEWID() 意味着您使用的是唯一标识符数据库类型,我没有在实体中看到字符串。您将需要构建自己的 NativeSequence 实例并覆盖 getGeneratedValue 以处理字符串而不是数字。请参阅上面评论中构建自定义策略的第一个链接。
标签: jpa eclipselink