4

NEWID()主キー フィールドが既定値として定義されている SQL Server データベースにテーブルがあります。クライアントは主キー フィールドの値を渡す必要はなく、SQL サーバーがそれを処理することが期待されます。

JPA でモデル クラスを定義するときに、この ID フィールドを生成タイプで定義する必要があります。IDENTITYTABLEおよび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;        
    ...
}
4

2 に答える 2

7

こんにちは@Joe2013まだ問題があるかどうかはわかりませんが、テーブルジェネレーターを使用していて、オブジェクトモデルに基づいてスキーマを生成するためにEclipse Linkを指定していない場合は、テーブルを手動で作成し、対応するジェネレーターとその初期値。そうしないと機能せず、前述のエラーが発生します。

于 2014-06-26T19:52:11.710 に答える
3

カスタムおよびデフォルトのシーケンス ID ジェネレーターの例を以下に示します。

カスタム シーケンス ID ジェネレーターを使用する (EclipseLink のみ)

カスタム シーケンス クラスを定義する

package org.phstudy.sequence;

public class MyNewIDSequence extends Sequence implements SessionCustomizer {
    private static final long serialVersionUID = -6308907478094680131L;
    public MyNewIDSequence() {
        super();
    }

    public MyNewIDSequence(String name) {
        super(name);
    }

    public void customize(Session session) throws Exception {
        MyNewIDSequence sequence = new MyNewIDSequence("mynewid");
        session.getLogin().addSequence(sequence);
    }

    @Override
    public Object getGeneratedValue(Accessor accessor, AbstractSession writeSession, String seqName) {
        DataReadQuery query = new DataReadQuery("select NEWID()");
        query.setResultType(DataReadQuery.VALUE);
        return writeSession.executeQuery(query);
    }

    @Override
    public Vector getGeneratedVector(Accessor accessor, AbstractSession writeSession, String seqName, int size) {
        return null;
    }

    @Override
    public void onConnect() { }

    @Override
    public void onDisconnect() { }

    @Override
    public boolean shouldAcquireValueAfterInsert() {
        return false;
    }

    @Override
    public boolean shouldUsePreallocation() {
        return false;
    }

    @Override
    public boolean shouldUseTransaction() {
        return false;
    }
}

カスタム シーケンスを persistence.xml に登録する

<persistence ...>
    <persistence-unit ...>
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
        <properties>
            ...
            <property name="eclipselink.session.customizer" value="org.phstudy.sequence.MyNewIDSequence"/>
            ...
    </persistence-unit>
</persistence>

カスタム シーケンス名でシーケンス アノテーションを追加

@Entity
public class CustomSequence {
    @Id
    @GeneratedValue(generator = "mynewid")
    private String id;
    ...
}

デフォルトのシーケンス ID ジェネレーターを使用する (JPA、EclipseLink、Hibernate)

TableSequenceまたはIDENTITYID 生成を使用する場合は、スキーマの自動生成を有効にするか、ID を格納するテーブルを手動で作成してください。

オプション#1。自動スキーマ生成を有効にする

<persistence ...>
    <persistence-unit ...>
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
        <properties>
            ...
            <property name="eclipselink.ddl-generation" value="create-tables"/>
            ...
    </persistence-unit>
</persistence>

オプション#2。ID を格納するテーブルを手動で作成する

エンティティでシーケンスを定義する

@SequenceGenerator(name="Emp_Gen", sequenceName="Emp_Seq")
@Id @GeneratedValue(generator="Emp_Gen") 
private int getId;

シーケンスを作成する SQL スクリプト

CREATE SEQUENCE Emp_Seq
     MINVALUE 1
     START WITH 1
     INCREMENT BY 50 //allocation size

于 2013-08-30T09:25:22.753 に答える