4

これは、PLAYプロジェクトで表現したい状況です。

table clients {
     client_id (pk),
     description
}

table items {
     client_id (fk, pk),
     item_id (pk)
}

'items'テーブルに、client_idとitem_idを組み合わせた複合主キーが必要です。JPAのドキュメントとこのトピックに関する多くの投稿を読みましたが、すべてが何度も失敗します。これは、私が試した多くのバージョンの1つであり、JPAドキュメントに最も近いものです。

@Entity
@Table(name = "items")
public class Items extends Model {
    ItemsPK primaryKey;

    public Items() {
    }

    @EmbeddedId
    public ItemsPK getPrimaryKey() {
        return primaryKey;
    }

    public void setPrimaryKey(ItemsPK pk) {
        primaryKey = pk;
    }
}

@Embeddable
public class ItemsPK implements Serializable {
    private long itemId;
    private Client client;

    public ItemsPK() {
    }

    @Column(name = "item_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long getItemId() {
        return itemId;
    }

    public void setItemId(long itemId) {
        this.itemId = itemId;
    }

    @ManyToOne
    @JoinColumn(name = "client_id", nullable = false)
    public Client getClient() {
        return client;
    }

    public void setClient(Client client) {
        this.client = client;
    }

    //public int hashCode() {...
    //public boolean equals(Object obj) {...
}

上記のコード(および他の多くの異なるセットアップ)は、プレイの起動中に次のエラーを生成します。

java.lang.RuntimeException:com.avaje.ebeaninternal.server.deploy.parse.ReadAnnotations.readAssociations(ReadAnnotations.java:73)〜[ebean.jar:na]のcom.avaje.ebeaninternalでmodels.ItemsPKの注釈の読み取り中にエラーが発生しました.server.deploy.BeanDescriptorManager.readDeployAssociations(BeanDescriptorManager.java:1100)〜[ebean.jar:na]

コードのどこが間違っているのかわかりません。PLAYのバグだと思い始めています。何か案は?

4

3 に答える 3

0

私の経験では、EmbeddedId内でGeneratedValueを使用することはできません。複合キーの値を割り当てる必要があります。以下の抜粋を参照してください。

GeneratedValueアノテーションの使用は、単純な主キーでのみサポートされる必要があります。GeneratedValueアノテーションの使用は、派生主キーではサポートされていません。

http://docs.oracle.com/javaee/6/api/javax/persistence/GeneratedValue.html

http://www.objectdb.com/api/java/jpa/GeneratedValue

itemId一意の識別子を生成するのに十分であるため、これには複合キーを使用しないことをお勧めします。

于 2012-05-23T17:54:07.820 に答える
0

Cześć、

これは答えではなく、提案です。あなたのケースで複合PKを使用する主な目標は何ですか?Ebean ORMを使用すると、両方のモデルが非常に小さくて簡単になります。

models / Client.java

package models;

import play.db.ebean.Model;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Client extends Model {
    @Id
    public Long id;
    public String description;
}

models / Item.java

package models;

import play.db.ebean.Model;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Item extends Model {
    @Id
    public Long id;

    @ManyToOne
    public Client client;
}

それだけです。複合PK以外に必要なものを提供します

于 2012-05-23T18:42:14.693 に答える
0

Ebeanを無効にしていないと思います。EbeanはPlay2のデフォルトのORMです。JPAを使用する場合は、Ebeanを無効にする必要があります。

したがって、Build.scalaに次を追加します。

val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
    ebeanEnabled := false
)

そして、application.confで次の行を編集します。

ebean.default="models.*"
于 2012-05-24T07:42:29.860 に答える