سؤال

هل من الممكن في سهل JPA أو JPA+السبات امتداد تعلن مفتاح مركب ، حيث عنصر من مركب مفتاح سلسلة?

هذا هو بلدي مركب الدرجة:

@Embeddable
public class IntegrationEJBPk implements Serializable {

    //...


    @ManyToOne(cascade = {}, fetch = FetchType.EAGER)
    @JoinColumn(name = "APPLICATION")
    public ApplicationEJB getApplication() {
        return application;
    }


    @Column(name = "ENTITY", unique = false, nullable = false, insertable = true, updatable = true)
    public String getEntity() {
        return entity;
    }

    @GeneratedValue(strategy = GenerationType.AUTO, generator = "INTEGRATION_ID_GEN")
    @SequenceGenerator(name = "INTEGRATION_ID_GEN", sequenceName = "OMP_INTEGRATION_CANONICAL_SEQ")
    @Column(name = "CANONICAL_ID", unique = false, nullable = false, insertable = true, updatable = true)
    public String getCanonicalId() {
        return canonicalId;
    }

    @Column(name = "NATIVE_ID", unique = false, nullable = false, insertable = true, updatable = true)
    public String getNativeId() {
        return nativeId;
    }

    @Column(name = "NATIVE_KEY", unique = false, nullable = false, insertable = true, updatable = true)
    public String getNativeKey() {
        return nativeKey;
    }

    //...
}

أنا بالفعل العرض القيم application, entity, nativeId و nativeKey.أريد لبناء كيان مثل واحد أدناه:

IntegrationEJB i1 = new IntegrationEJB();
i1.setIntegrationId(new IntegrationEJBPk());
i1.getIntegrationId().setApplication(app1);
i1.getIntegrationId().setEntity("Entity");
i1.getIntegrationId().setNativeId("Nid");
i1.getIntegrationId().setNativeKey("NK");

و عندما أتصل em.persist(i1) ، أريد أن canonicalId يتم إنشاء ودمج يتم إدراجها.

هل هذا ممكن ؟ إذا كان الأمر كذلك ، ما هي بسيطة الطريقة ؟ (أنا أفضل عدم استخدام التطبيق-توفير مفاتيح أو sql الأصلي).

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

المحلول

وأعتقد أن هذا غير ممكن مع عادي نقابة الصحفيين.

نصائح أخرى

باستخدام @GeneratedValue مركب PKs لم يتم تحديد داخلها JPA 2 المواصفات.

من JPA المواصفات:

11.1.17 GeneratedValue الشرح

على GeneratedValue الشرح ينص على مواصفات الجيل استراتيجيات قيم المفاتيح الأساسية.على GeneratedValue الشرح يمكن تطبيقها على مفتاح أساسي أو الممتلكات مجال كيان أو تعيين الفائقة بالتزامن مع معرف الشرح.[97] استخدام GeneratedValue الشرح فقط مطلوب دعم بسيط المفاتيح الأساسية.استخدام GeneratedValue الشرح مدعوما مشتقة المفاتيح الأساسية.

لاحظ أنه في ظل سيناريو مختلف ، هل يمكن أن يكون أحد الوالدين كيان بسيط PK (@Id) يستخدم @GeneratedValue ، ومن ثم يكون الطفل كيان مركب PK يتضمن إنشاء معرف من الوالد ، بالإضافة إلى عمود آخر.

  • إعطاء الطفل @ManyToOne العلاقة مع الكيان الأم ، بحيث يرث إنشاء معرف في FK العمود.
  • ثم تعطي الطفل مركب PK, via @IdClass محددة ضد الكيان ، بالإضافة إلى اثنين @Id الأعمدة داخل الكيان.
@Entity
public class ParentEntity {
       @Id
       @GenerateValue(IDENTITY) // If using DB auto-increment or similar
       int id;

       // ...
}
@Entity
@IdClass(ChildId.class)
public class ChildEntity {
   // The child table will have a composite PK:
   // (parent_ID, child_name)
       @Id 
       @ManyToOne
       int parentEntity;
       @Id
       String childName;

       String favoriteColor;  // plus other columns

       // ...

}
// child Id attributes have the same name as the child entity
// however the types change to match the underlying PK attributes 
// (change ParentEntity to int)
 public class ChildId implements Serializable {
        int parentEntity;
        String childName;

        public ChildId() { //... }

        // Add extra constructor & remove setter methods so Id objects are immutable
        public ChildId(int parentEntity, String childName) { //... }


        public int getParentEntity() { //... }
        // make Id objects immutable:
        //  public void setParentEntity(int parentEntity) { //... }
        public String getChildName() { //... }
        //  public void setChildName(String childName) { //... }
}

وحاول مثل هذا:

@TableGenerator(name = "canonicalKeys", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.TABLE, generator = "canonicalKeys")
@Column(name = "CANONICAL_ID", unique = false, nullable = false, insertable = true, updatable = true)
public String getCanonicalId() {
    return canonicalId;
}

في هذه الطريقة بدلا من استخدام تسلسل يمكنك استخدام جدول.

ولقد لاحظت أنه يبدو الخاص بناء على مفتاح أساسي مركب مثل هذا <وأ href = "http://boris.kirzner.info/blog/archives/2008/07/19/hibernate-annotations-the-many-to -many-جمعية مع مركب مفتاح / "يختلط =" نوفولو noreferrer "> مثال . بينما كنت بدس في مشكلة مماثلة في قاعدة البيانات الخاصة بي وكنت أتساءل إذا ربما يمكن أن نطلق على SQL مباشرة مثل:

وselect nextval ('hibernate_sequence')

وأفترض أنه سيتم الغش الرغم من ذلك؛ -)

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