2010-02-05 1 views
5

Я создаю приложение J2SE с EJB3 и DB Express Express Edition.EJB3 - @Column (insertable = "false") question

Моя проблема в том, что я устанавливаю 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") 

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

Я делаю что-то неправильно здесь?

Спасибо!

ответ

0

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

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

1

Со следующими примечаниями:

@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 = "my database default"; (да, это некрасиво) - ИЛИ -
  • изменить поставщика сохраняемости (для OpenJPA, Hibenate)
1

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

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


} 
1

TOPLINK Основы только опустить столбец, если у вас есть и вставляться и обновляемыми = ложь.

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

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