5

JPA は初めてで、Message という pojo が という結合テーブルによって定義された整数グループ ID のリストを持つことができる、非常に単純な 1 対多の関係をセットアップしようとしていますGROUP_ASSOC。DDL は次のとおりです。

CREATE TABLE "APP"."MESSAGE" (
        "MESSAGE_ID" INTEGER NOT NULL は常に IDENTITY として生成されます (1 で始まり、1 ずつ増加)
    );

ALTER TABLE "APP"."MESSAGE" ADD CONSTRAINT "MESSAGE_PK" PRIMARY KEY ("MESSAGE_ID");

CREATE TABLE "APP"."GROUP_ASSOC" (
        "GROUP_ID" INTEGER NOT NULL,
        "MESSAGE_ID" INTEGER NOT NULL
    );

ALTER TABLE "APP"."GROUP_ASSOC" ADD CONSTRAINT "GROUP_ASSOC_PK" PRIMARY KEY ("MESSAGE_ID", "GROUP_ID");

ALTER TABLE "APP"."GROUP_ASSOC" ADD CONSTRAINT "GROUP_ASSOC_FK" FOREIGN KEY ("MESSAGE_ID")
    REFERENCES "APP"."MESSAGE" ("MESSAGE_ID");

ここにポジョがあります:

@Entity
@Table(name = "MESSAGE")
public class Message {
    @Id
    @Column(name = "MESSAGE_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int messageId;

    @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.PERSIST)
    private List groupIds;

    public int getMessageId() {
        return messageId;
    }
    public void setMessageId(int messageId) {
        this.messageId = messageId;
    }
    public List getGroupIds() {
        return groupIds;
    }
    public void setGroupIds(List groupIds) {
        this.groupIds = groupIds;
    }
}

@ColumngroupIds プロパティへのマッピングがないため、これが間違っていることはわかっていGROUP_ASSOC.GROUP_IDますが、うまくいけば、これは私たちがやろうとしていることを示しています。次のテスト コードを実行すると、<openjpa-1.2.3-SNAPSHOT-r422266:907835 fatal user error> org.apache.openjpa.util.MetaDataException: The type of field "pojo.Message.groupIds" isn't supported by declared persistence strategy "OneToMany". Please choose a different strategy.

Message msg = new Message();
List groups = new ArrayList();
groups.add(101);
groups.add(102);
EntityManager em = Persistence.createEntityManagerFactory("TestDBWeb").createEntityManager();
em.getTransaction().begin();
em.persist(msg);
em.getTransaction().commit();

ヘルプ!

4

1 に答える 1

3

JPA を使用するときは、オブジェクトとオブジェクト間の関係を考え、 ではなくオブジェクト モデルをリレーショナル モデルにマップする必要があります(ただし、JPA 2.0 では基本的な値のidsをマップすることは可能ですが、直前に述べたことはまだ適用されます)。List@ElementCollection

ここで、(これが実際にand間の一対多の関係であり、エンティティ間の多対多の関係ではないと仮定すると)、次のようなものが必要です:MessageGroupAssocMessageGroup

@Entity
@Table(name = "MESSAGE")
public class Message implements Serializable {
    @Id
    @Column(name = "MESSAGE_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)    
    private Long messageId;

    @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.PERSIST)    
    private List<GroupAssoc> groupAssocs = new ArrayList<GroupAssoc>();

    public Long getMessageId() {
        return messageId;
    }
    public void setMessageId(Long messageId) {
        this.messageId = messageId;
    }

    public List<GroupAssoc> getGroupAssocs() {
        return groupAssocs;
    }
    public void setGroupAssocs(List<GroupAssoc> groupAssocs) {
        this.groupAssocs = groupAssocs;
    }

    // equals() and hashCode()
}

と の別のエンティティですGroupAssoc

MESSAGEPS: あなたの DDL は本当にとの間の (M:N) 関係のように見えますGROUP(または の PK 制約を理解していませんGROUP_ASSOC) が、FK 制約を表示していGROUP_IDないので、100% 確信が持てません。ただし、その場合は、の@ManyToMany代わりにを使用する必要があり@OneToManyます。

于 2010-03-23T01:08:40.927 に答える