сопоставить значение столбца по умолчанию с аннотациями - PullRequest
1 голос
/ 12 сентября 2010
@Entity
@Table(name = "J_CNTRY")
public class CountryEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "myTableGenerator")
    @TableGenerator(name = "myTableGenerator", allocationSize = 5, pkColumnName = "pkName", valueColumnName = "pkValue", table = "j_cntry_pk_table")
    private Long id;

    private String country;

    @Generated(GenerationTime.INSERT)
    @Column(name = "CREATION_TIME", columnDefinition = "DATE default '15-JUL-1980'", insertable = false)
    private Date creationTime;

    public CountryEntity() {
    }

    public Long getId() {
        return id;
    }

    public void setId(final Long id) {
        this.id = id;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(final String country) {
        this.country = country;
    }

    public Date getCreationTime() {
        return creationTime;
    }

    @Override
    public String toString() {
        return "Country [id=" + id + ", country=" + country + ", creationTime="
                + creationTime + "]";
    }

}

Я ожидаю, что значение '15 -JUL-1980 'будет вставлено для каждой строки, ЕСЛИ Я НЕ УСТАНАВЛИВАЮ свое значение.

Но оно не работает должным образом.Я что-то здесь не так делаю?

По некоторым причинам я хочу установить значение по умолчанию в приложении, а не в базе данных.

ОБНОВЛЕНИЕ :

Изначально я пытался без «inserttable = false».

Как новичок, я пробовал разные варианты и оставил эту опцию.

Вот тестовый пример, который яработает:

@Test
    public void testCreateCountry4() {
        final CountryEntity a1 = new CountryEntity();
        a1.setCountry("Xxxx");
        final Session currentSession = sessionFactory.getCurrentSession();
        final Long savedId = (Long) currentSession.save(a1);
        System.out.println("Saved with ID = " + savedId);
        currentSession.flush();
        System.out.println("Saved object = " + a1);
        assertNotNull(savedId);
    }

и полученный результат:

Saved with ID = 85
Hibernate: 
    /* insert entities.CountryEntity
        */ insert 
        into
            J_CNTRY
            (country, id) 
        values
            (?, ?)
Hibernate: 
    /* get generated state entities.CountryEntity */ select
        countryent_.CREATION_TIME as CREATION3_2_ 
    from
        J_CNTRY countryent_ 
    where
        countryent_.id=?
Saved object = Country [id=85, country=Xxxx, creationTime=null]

Таблица:

CREATE TABLE "FOO"."J_CNTRY" 
   (    "ID" VARCHAR2(255 BYTE) NOT NULL, 
    "COUNTRY" VARCHAR2(255 BYTE), 
    "CREATION_TIME" DATE, 
     CONSTRAINT "J_CNTRY_PK" PRIMARY KEY ("ID")
}

1 Ответ

2 голосов
/ 12 сентября 2010

Я ожидаю, что значение '15 -JUL-1980 'будет вставлено для каждой строки, ЕСЛИ Я НЕ УСТАНАВЛИВАЮ ЕГО значение.

На самом деле, creationTime никогда не будетбыть частью оператора SQL INSERT, даже если вы установили значение из-за insertable = false.

Но оно не работает должным образом.Я что-то здесь не так делаю?

Что не работает точно ?Можете ли вы показать сценарий DDL для таблицы?Какой оператор DML INSERT выполняется точно?Правильно ли установлен Oracle по умолчанию?Разве вы не возвращаете его обратно в сущность после вставки?Когда происходит сбой?

На всякий случай, вы не пропустили аннотацию Temporal на creationTime?Согласно спецификации JPA 1.0:

9.1.20 Временная аннотация

Temporal аннотация должна указываться для постоянных полей или свойств типа java.util.Date и java.util.Calendar.Это может быть указано только для полей или свойств этих типов.

Я бы добавил @Temporal(TemporalType.DATE).

Не уверен, что это решит проблему, но ответы на вышеуказанные вопросы могут помочь в диагностике проблемы.


Я хочу, чтобы Hibernate устанавливал значение по умолчанию, когда бы я ниЯ пытаюсь вставить.Таблица, которую я показал, является фиктивной таблицей, которую я создал для целей тестирования / обучения.Исходная таблица является устаревшей и не имеет установленного атрибута «DEFAULT».Извините за путаницу.

Элемент columnDefinition аннотации Column используется для указания фрагмента SQL, который используется при генерации DDL для столбца , то естьвсе.Если вы не используете провайдера JPA для генерации DDL, и если в вашей таблице не определено DEFAULT, ничего не произойдет.

Так что в вашем случае я бы, вероятно, использовал обратный вызов жизненного цикла иустановите дату, если null во время PrePersist:

@Entity
public class Account {
    ...

    @PrePersist
    protected void setCreationDateIfRequired() {
        if (getCreationDate() == null) {
            setCreationDate(...);
        }
    }

}

Ссылка

  • JPA 1.0 Спецификация
    • Раздел 3.5.1 «Методы обратного вызова жизненного цикла»
...