EJB3 - вопрос @Column(insertable=false)

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

Моя проблема такова: я установил EntityBean в своем проекте, который соответствует таблице в БД. Таблица содержит столбец, который не может принимать значения NULL и имеет значение по умолчанию. Все, что я хочу, это то, что при сохранении новых данных в эту таблицу с помощью 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")

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

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

Спасибо!


person WhiteTigerK    schedule 05.02.2010    source источник


Ответы (4)


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

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

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

  • использовать private String m_firstName = "my database default"; (да, это некрасиво) - ИЛИ -
  • изменить поставщика сохраняемости (для OpenJPA, Hibenate)
person Pascal Thivent    schedule 08.02.2010

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

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


}
person funfin    schedule 27.05.2010

TopLink Essentials пропустит столбец только в том случае, если у вас и вставляемый, и обновляемый = false.

Это было исправлено в EclipseLink, поэтому вам следует подумать об обновлении.

http://www.eclipse.org/eclipselink/

person James    schedule 12.05.2011

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

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

person Thilo    schedule 06.02.2010