2010-03-31 12 views
7

Mam pewne problemy z dziedziczeniem i adnotacją @PrePersist. Mój kod źródłowy wygląda następująco:@PrePersist z dziedziczeniem encji

_The klasa „baza” z adnotacjami updateDates() metoda:

@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(); 
    } 
} 

_ teraz klasa „dziecko”, które powinny dziedziczyć wszystkie metody „i adnotacji " z klasy bazowej:

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

Gdybym przechowywania/utrzymują instancji klasy bazowej do bazy danych, wszystko działa bez zarzutu. Daty są aktualizowane. Ale teraz, jeśli chcę utrzymywać instancji dzieci, baza rzuca następujący wyjątek:

MySQLIntegrityConstraintViolationException: Column 'CREATIONDATE' cannot be null 

Tak więc, moim zdaniem, jest to spowodowane tym, że u dziecka metodę „@PrePersist protected void updateDates()” nie jest wywoływany/wywoływany przed utrzymywaniem instancji w bazie danych.

Co jest nie tak z moim kodem?

Odpowiedz

5

Testowałem twój kod z Hibernate jako dostawcą JPA (i HSQLDB). Właśnie wydał następujące zmiany w klasie bazowej (bo nie można używać IDENTIY - domyślne z HSQLDB, a także z MySQL, jeśli nie jestem zły - z TABLE_PER_CLASS strategii):

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

Dzięki tej zmianie następująca metoda badania przechodzi:

@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()); 
} 

Więc @PrePersist adnotacją metoda jest wywoływana w dziedziczonej klasie.

To nasuwa pytanie: z jakiego dostawcy JPA korzystasz?

patrz this thread dla tła w tej sprawie.

Powiązane problemy