2

データベースに接続するアプリケーションのサーバー部分のjunitテストを書いています。私たちの通常の戦略は、テストが Oracle データベースではなく hsqldb src/test/resources/.META-INF/persistence.xml

そして、ここに私の問題があります-エンティティの1つに、次のように定義されたフィールドがあります:

@Id
@Column(name = "ID", nullable = false)
@SequenceGenerator(name="sequence", sequenceName="sequence")
@GeneratedValue(generator="sequence")
protected Integer id;

アプリケーションの標準実行中は問題なく動作します-@GeneratedValueの特定の戦略を定義していないためGenerationType.AUTOhttp://docs.oracle.com/javaee/5/api/javax/persistence/GenerationType. html#AUTOを使用すると、永続化プロバイダーは、その下にあるデータベースに応じて使用する戦略を決定できます。通常、それは Oracle であり、Oracle のデフォルトのジェネレーター戦略はGenerationType.SEQUENCEです。

しかし、テストを実行すると、次のようになります。

[junit] Testcase: xxx.TestCase took 0 sec
[junit]     Caused an ERROR
[junit] "xxx.Entity.id" declares generator name "sequence", but uses the AUTO generation type.  The only valid generator names under AUTO are "uuid-hex" and "uuid-string".

Hibernate @ generatedvalue for HSQLDBのコメントによると、hsqldb のデフォルト戦略はGenerationType.IDENTITY.

明らかな解決策はstrategy=GenerationType.SEQUENCE、エンティティのフィールド定義に追加することですが、1) テスト ケースに対応するために作業コードを変更することは、一般的に悪い習慣です。2) 私には、このエンティティを変更するアクセス権も権限もありません。したがって、変更できないと仮定すると、次の予感は、 Hibernate にデータベースのデフォルトの代わりにMETA-INF/persistence.xmlデフォルトのジェネレーター戦略を指示する persistece-unit 定義内のテストにいくつかのプロパティを配置することです。SEQUENCE

私はそれを行うことができますか? はいの場合はどうすればそれを行うことができますか? いいえの場合は他に何ができますか?

4

2 に答える 2

2

いいえ、永続化ユニット全体のデフォルトを変更することはできませんが、XML マッピングで戦略をオーバーライドできます。

@Entity
public class EntityA {
    @Id
    @GeneratedValue
    protected Integer id;
    ...
}

META-INF の orm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd" version="2.0">
    <package>somepackage.somewhere</package>
    <entity class="EntityA" metadata-complete="false" access="FIELD">
        <attributes>
            <id name="id">
                <generated-value strategy="SEQUENCE"/>
             </id>
        </attributes>
    </entity>
</entity-mappings>

上記の例の metadata-complete="false"は、オーバーライドされていない注釈が引き続き適用されることを意味します。多くの場合、複数のソースからのコピーと貼り付けに問題があるため、ファイルは完全に貼り付けられます。

マッピングのオーバーライドの詳細については、Hibernate のドキュメントなどを参照してください。

于 2012-10-25T18:51:12.163 に答える
0

必ずSEQUENCEデータベースで行ってください。

例 :

CREATE SEQUENCE example_sq START WITH 50 INCREMENT BY 50;   

を使用しstrategy=GenerationType.SEQUENCEます。こちらがさらに参考になります。

@Id
@SequenceGenerator(name = "sequence", sequenceName = "sequence", allocationSize=50)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequence")
protected Integer id;
于 2012-10-25T07:17:29.443 に答える