java @Id के बिना हाइबरनेट/दृढ़ता




hibernate primary-key (5)

मेरे पास एक डेटाबेस दृश्य है जो परिणाम सेट उत्पन्न करता है जिसमें कोई वास्तविक प्राथमिक कुंजी नहीं है। मैं इस ऑब्जेक्ट को जावा ऑब्जेक्ट्स पर सेट करने के लिए हाइबरनेट / पर्सिस्टेंस का उपयोग करना चाहता हूं। बेशक, क्योंकि कोई पीके नहीं है, मैं @Id साथ किसी भी क्षेत्र को सजाने नहीं कर सकता।

तैनाती करते समय, हाइबरनेट लापता @Id बारे में शिकायत करता है। मैं इसके आसपास कैसे काम कर सकता हूं?


हाइबरनेट में वर्कअराउंड खोजने के बजाय अपने डेटाबेस दृश्य में डमी आईडी जोड़ना आसान हो सकता है। आइए मान लें कि हमारे पास दो कॉलम के साथ PostgreSQL दृश्य है और उनमें से कोई भी अद्वितीय नहीं है (और कोई प्राथमिक कुंजी नहीं है क्योंकि पोस्टग्रेस पीके या दृश्यों पर किसी भी अन्य बाधाओं को बनाने की अनुमति नहीं देता है) पूर्व।

| employee_id | project_name |
|:------------|:-------------|
| 1           | Stack01      |
| 1           | Jira01       |
| 1           | Github01     |
| 2           | Stack01      |
| 2           | Jira01       |
| 3           | Jira01       |
------------------------------

निम्नलिखित क्वेरी द्वारा प्रतिनिधित्व किया जाता है:

CREATE OR REPLACE VIEW someschema.vw_emp_proj_his AS
    SELECT DISTINCT e.employee_id,
                    pinf.project_name
    FROM someschema.project_info pinf
    JOIN someschema.project_employee pe ON pe.proj_id = pinf.proj_id
    JOIN someschema.employees e ON e.employee_id = pe.emloyee_id

हम row_number () का उपयोग कर डमी आईडी जोड़ सकते हैं:

SELECT row_number() OVER (ORDER BY subquery.employee_id) AS row_id

इस उदाहरण की तरह:

CREATE OR REPLACE VIEW someschema.vw_emp_proj_his AS
SELECT row_number() OVER (ORDER BY subquery.employee_id) AS row_id,
       subquery.employee_id,
       subquery.project_name
FROM
  (SELECT DISTINCT e.employee_id,
                   pinf.project_name
   FROM someschema.project_info pinf
   JOIN someschema.project_employee pe ON pe.proj_id = pinf.proj_id
   JOIN someschema.employees e ON e.employee_id = pe.emloyee_id ) subquery;

और तालिका इस तरह दिखेगी:

| row_id      | employee_id | project_name |
|:------------|:------------|:-------------|
| 1           | 1           | Stack01      |
| 2           | 1           | Jira01       |
| 3           | 1           | Github01     |
| 4           | 2           | Stack01      |
| 5           | 2           | Jira01       |
| 6           | 3           | Jira01       |
-------------------------------------------

अब हम जेपीए / हाइबरनेट / स्प्रिंग डेटा में row_id @Id के रूप में उपयोग कर सकते हैं:

@Id
@Column(name = "row_id")
private Integer id;

उदाहरण की तरह:

@Entity
@Table(schema = "someschema", name = "vw_emp_proj_his")
public class EmployeeProjectHistory {

    @Id
    @Column(name = "row_id")
    private Integer id;

    @Column(name = "employee_id")
    private Integer employeeId;

    @Column(name = "project_name")
    private String projectName;

//Getters, setters etc.

}

वही नहीं है जो आप पूछ रहे हैं, यहां एक छोटी सी चाल है जिसका मैं उपयोग करता हूं। प्रश्न "राउनम" का चयन करें और मॉडल में अपने आईडी कॉलम के रूप में "राउनम" को परिभाषित करें। यह प्रभावी ढंग से प्रत्येक पंक्ति को हाइबरनेट के लिए अद्वितीय बना देगा।


यहां एक उदाहरण दिया गया है जिसमें "आईडी" कुंजी के रूप में 2 कुंजी हैं: https://gist.github.com/3796379


प्रत्येक इकाई के लिए, आपको निम्न में से कम से कम एक निर्दिष्ट करना होगा:

  • एक @Id
  • एकाधिक @ आईडी और एक @IdClass (एक समग्र प्राथमिक कुंजी के लिए)
  • @EmbeddedId

तो हो सकता है कि आप एक समग्र प्राथमिक कुंजी बना सकें, जिसमें एकाधिक फ़ील्ड हों?


यदि कॉलम का संयोजन होता है जो पंक्ति को अनूठा बनाता है, कॉलम के संयोजन के आसपास एक प्राथमिक कुंजी वर्ग मॉडल करें। यदि ऐसा नहीं है, तो आप मूल रूप से किस्मत से बाहर हैं - लेकिन आपको दृश्य के डिजाइन को दोबारा बनाना चाहिए क्योंकि शायद यह समझ में नहीं आता है।

कुछ अलग दृष्टिकोण हैं:

@Entity
public class RegionalArticle implements Serializable {

    @Id
    public RegionalArticlePk getPk() { ... }
}

@Embeddable
public class RegionalArticlePk implements Serializable { ... }

या:

@Entity
public class RegionalArticle implements Serializable {

    @EmbeddedId
    public RegionalArticlePk getPk() { ... }
}

public class RegionalArticlePk implements Serializable { ... }

विवरण यहां हैं: http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html#d0e1517

यहां एक पोस्टिंग है जो एक समान समस्या का वर्णन करती है: http://www.theserverside.com/discussions/thread.tss?thread_id=22638





hibernate-annotations