EJB3 - @Column(inserttable="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")
Это означает, что диспетчер постоянства пытается вставить поле имени, хотя я сказал, что нет.
Я что-то здесь не так делаю?
Спасибо!
4 ответа
TopLink Essentials пропустит столбец только в том случае, если у вас есть и вставляемый, и обновляемый = ложь.
Это было исправлено в EclipseLink, поэтому вы должны рассмотреть возможность обновления.
Попробуйте добавить что-то подобное в свой класс сущностей. Это означает исключить нулевые значения свойств в SQL Hibernate
@Entity
@Table(name = "your_table")
@org.hibernate.annotations.Entity(
dynamicInsert = true
)
public class YourClass{
}
Со следующими аннотациями:
@Basic(optional = false)
@Column(name = "FIRST_NAME", insertable = false, updatable = true, nullable = false)
private String m_firstName;
FIRST_NAME
столбец должен определенно игнорироваться при генерации вставок SQL. Другими словами, это похоже на ошибку в TopLink Essentials, которая разработана в сообществе GlassFish. На самом деле, я думаю, что эта проблема сообщается в выпуске № 627 ("Вставка аннотации столбца =false работает только при использовании Updatable =false"). К сожалению, это не исправлено, поэтому я бы предложил:
- использовать
private String m_firstName = "my database default";
(да, это безобразно) - ИЛИ - - изменить поставщика постоянства (для OpenJPA, Hibenate)
Можете ли вы попробовать без @Basic(optional = true)
потому что это соответствует NULLABLE
(что не так в вашем случае)?
Определяет, может ли значение поля или свойства быть нулевым.