EJB3 - @Column (insertable = “ложь”) вопрос

Я создаю приложение J2SE с EJB3 и Oracle Express Edition DB.

Моя проблема похожа на это - я установил EntityBean в своем проекте, который соответствует таблице в DB. Таблица содержит столбец, который не nullable и имеет значение по умолчанию. Все, что я хочу, - то, что при сохранении новых данных к этой таблице с помощью EJB, значение столбца получит свое значение по умолчанию. Это - то, как я установил его в проекте:

//holds user's first name
@Basic(optional = true)
@Column(name = "FIRST_NAME", insertable = false, updatable = true, nullable = false)
private String m_firstName;

Я также установил его в файле ORM.XML:

    <basic name="firstName">
        <column name="FIRST_NAME" insertable="false" updatable="true" nullable="false"/>
    </basic>

Но по некоторым причинам, создавая новый EntityBean и не устанавливая поле имени и затем пытаясь сохранить его, я получаю следующее исключение:

Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.1 (Build b60e-fcs (12/23/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-01400: cannot insert NULL into ("TSDB"."USERS"."FIRST_NAME")

Что означает, что менеджер по персистентности пытается вставить поле имени, хотя я сказал его не.

Я делаю что-то не так здесь?

Спасибо!

5
задан OMG Ponies 12 May 2011 в 05:20
поделиться

3 ответа

Можете ли вы попробовать без @Basic(optional = true), потому что что сопоставляет с NULLABLE (что кажется неправильным в вашем случае)?

Определяет, может ли значение поля или свойства быть нулевым.

0
ответ дан 15 December 2019 в 06:25
поделиться

Со следующими аннотациями:

@Basic(optional = false)
@Column(name = "FIRST_NAME", insertable = false, updatable = true, nullable = false)
private String m_firstName;

Столбец FIRST_NAME должен определенно игнорироваться при генерации вставок SQL. Другими словами, это звучит как ошибка в TopLink Essentials, разработанном сообществом GlassFish. На самом деле, я думаю, что эта проблема описана в Issue # 627 ( «Аннотация столбца insertable = false работает только при использовании с updatable = false» ).К сожалению, это не исправлено, поэтому я предлагаю:

  • использовать private String m_firstName = "моя база данных по умолчанию"; (да, это некрасиво) - ИЛИ -
  • , чтобы изменить постоянство провайдер (для OpenJPA, Hibenate)
1
ответ дан 15 December 2019 в 06:25
поделиться

попробуйте добавить что-то вроде этого в ваш класс сущности. Это означает исключение нулевых значений свойств в SQL Hibernate

@Entity
@Table(name = "your_table")
@org.hibernate.annotations.Entity(
  dynamicInsert = true
)
public class YourClass{


}
1
ответ дан 15 December 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: