JPA مفتاح مركب + تسلسل
-
04-07-2019 - |
سؤال
هل من الممكن في سهل 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')
وأفترض أنه سيتم الغش الرغم من ذلك؛ -)