@PrePersist с наследованием сущностей - PullRequest
7 голосов
/ 31 марта 2010

У меня проблемы с наследованием и аннотацией @ PrePersist . Мой исходный код выглядит следующим образом:

_основной класс с аннотированным методом updateDates ():

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

_ теперь класс 'Child', который должен наследовать все методы "и аннотации" от базового класса:

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

Если я сохраняю / сохраняю экземпляры класса Base в базе данных, все работает нормально. Даты обновляются. Но теперь, если я хочу сохранить дочерний экземпляр, база данных выдает следующее исключение:

MySQLIntegrityConstraintViolationException: Column 'CREATIONDATE' cannot be null

Так что, на мой взгляд, это вызвано тем, что в Child метод "@PrePersist protected void updateDates ()" не вызывается / не вызывается до сохранения экземпляров в базе данных.

Что не так с моим кодом?

1 Ответ

5 голосов
/ 31 марта 2010

Я проверил ваш код в Hibernate в качестве поставщика JPA (и HSQLDB). Я только что сделал следующее изменение в базовом классе (потому что вы не можете использовать IDENTIY - по умолчанию с HSQLDB, а также с MySQL, если я не ошибаюсь - со стратегией TABLE_PER_CLASS 1 ) :

@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 вызывается в унаследованном классе.

Возникает вопрос: каким провайдером JPA вы пользуетесь?

1 см. эту тему для справки об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...