نوع الحقل لا يدعمه استراتيجية الثبات المعلنة "Onetomany"

StackOverflow https://stackoverflow.com/questions/2496131

  •  21-09-2019
  •  | 
  •  

سؤال

نحن جدد في JPA ونحاول إعداد علاقة بسيطة للغاية للعديد من العلاقات حيث يمكن أن يكون للرسالة التي تسمى POJO قائمة بمعرف مجموعة عدد صحيح محدد بواسطة جدول انضمام يسمى GROUP_ASSOC. ها هو DDL:

CREATE TABLE "APP"."MESSAGE" (
        "MESSAGE_ID" INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 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;
    }
}

أعلم أن هذا خطأ لأنه لا يوجد @Column رسم الخرائط ل GROUP_ASSOC.GROUP_ID بالنسبة لممتلكات GroupIDS ، ولكن نأمل أن يوضح هذا ما نحاول القيام به. عندما ندير رمز الاختبار التالي نحصل عليه <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();

مساعدة!

هل كانت مفيدة؟

المحلول

عندما تعمل مع JPA ، يجب أن تفكر في الكائن والعلاقات بين الكائنات ويجب عليك تعيين نموذج الكائن الخاص بك ، وليس ids, ، إلى النموذج العلائقي الخاص بك (من الممكن تعيين أ List من القيم الأساسية مع @ElementCollection في JPA 2.0 ولكن ما قلته قبل أن يطبق).

هنا ، (على افتراض أن هذا هو حقا واحد لكثير العلاقة بين Message و GroupAssoc وليس الكثير للكثيرين العلاقة بين Message و Group الكيانات) يجب أن يكون لديك شيء مثل هذا:

@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.

ملاحظة: يبدو أن DDL الخاص بك يشبه العلاقة (M: N) بين MESSAGE و GROUP (أو لا أفهم قيود PK من GROUP_ASSOC) لكنك لم تعرض أي قيد على FK GROUP_ID لذلك لست متأكدًا بنسبة 100 ٪. ولكن إذا كان هذا هو الحال ، فيجب عليك استخدام @ManyToMany بدلاً من @OneToMany.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top