2010-03-31 10 views
7

मुझे विरासत और @PrePersist एनोटेशन के साथ कुछ समस्याएं आ रही हैं।@ इकाई विरासत के साथ @PrePersist

एनोटेट updateDates साथ _The 'आधार' वर्ग() विधि:

@javax.persistence.Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class Base implements Serializable{ 

    ... 

    @Id 
    @GeneratedValue 
    protected Long id; 
    ... 
    @Column(nullable=false) 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date creationDate; 
    @Column(nullable=false) 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date lastModificationDate; 
    ... 
    public Date getCreationDate() { 
     return creationDate; 
    } 
    public void setCreationDate(Date creationDate) { 
     this.creationDate = creationDate; 
    } 
    public Date getLastModificationDate() { 
     return lastModificationDate; 
    } 
    public void setLastModificationDate(Date lastModificationDate) { 
     this.lastModificationDate = lastModificationDate; 
    } 
    ... 
    @PrePersist 
    protected void updateDates() { 
     if (creationDate == null) { 
     creationDate = new Date(); 
     } 
     lastModificationDate = new Date(); 
    } 
} 

_ अब 'बाल' वर्ग कि सभी तरीकों के वारिस चाहिए "और एनोटेशन मेरे स्रोत कोड की तरह लग रहा है निम्नलिखित " आधार वर्ग से:

@javax.persistence.Entity 
@NamedQueries({ 
    @NamedQuery(name=Sensor.QUERY_FIND_ALL, query="SELECT s FROM Sensor s") 
}) 
public class Sensor extends Entity { 
    ... 
    // additional attributes 
    @Column(nullable=false) 
    protected String value; 
    ... 
    // additional getters, setters 
    ... 
} 

अगर मैं स्टोर/डेटाबेस के लिए आधार वर्ग के उदाहरण जारी रहती है, सब कुछ ठीक काम करता है। तिथियां अपडेट हो रही हैं। लेकिन अब, अगर मैं एक बच्चे के उदाहरण बनाए रखना चाहते, डेटाबेस निम्नलिखित अपवाद फेंकता है:

MySQLIntegrityConstraintViolationException: Column 'CREATIONDATE' cannot be null 

तो, मेरी राय में, इस वजह से बच्चे में विधि के कारण होता है "@PrePersist संरक्षित शून्य updateDates()" डेटाबेस में उदाहरणों को जारी रखने से पहले बुलाया/बुलाया नहीं जाता है।

मेरे कोड में क्या गलत है?

उत्तर

5

मैंने आपके कोड को जेबए प्रदाता (और एचएसक्यूएलडीबी) के रूप में हाइबरनेट के साथ परीक्षण किया है। मैं सिर्फ आधार वर्ग में निम्नलिखित परिवर्तन किया (क्योंकि आप IDENTIY उपयोग नहीं कर सकते - HSQLDB के साथ डिफ़ॉल्ट है और यह भी MySQL के साथ अगर मैं गलत नहीं कर रहा हूँ - एक TABLE_PER_CLASS रणनीति के साथ):

@Id 
@GeneratedValue(strategy = GenerationType.TABLE) 
protected Long id; 

इस बदलाव के साथ, निम्नलिखित परीक्षा पद्धति से गुजरता है:

@Test 
public void test_Insert_EntityWithInheritedPrePersist() { 
    EntityWithInheritedPrePersist child = new EntityWithInheritedPrePersist(); 
    child.setValue("test"); 
    entityManager.persist(child); 

    assertEquals(child.getId(), Long.valueOf(1l)); 
    assertNotNull(child.getCreationDate()); 
    assertNotNull(child.getLastModificationDate()); 
} 

तो @PrePersist एनोटेट विधि विरासत में मिला कक्षा में बुलाया जाता है।

यह सवाल पूछता है: आप किस जेपीए प्रदाता का उपयोग करते हैं?

इस पर पृष्ठभूमि के लिए this thread देखें।

संबंधित मुद्दे