5

我正在使用 EJB3 和 Oracle Express Edition DB 构建 J2SE 应用程序。

我的问题就是这样 - 我在我的项目中设置了一个与数据库中的表匹配的 EntityBean。该表包含一个不可为空且具有默认值的列。我想要的是,当使用 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

4 回答 4

1

TopLink Essentials will only omit the column if you have both insertable and updateable = false.

This was fixed in EclipseLink, so you should consider upgrading.

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

于 2011-05-12T13:34:58.630 回答
1

尝试将这样的东西添加到您的实体类中。这意味着在 Hibernate 的 SQL 中排除 null 属性值

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


}
于 2010-05-27T20:42:23.703 回答
1

带有以下注释:

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

在生成 SQL 插入时,绝对应该忽略该FIRST_NAME列。换句话说,这听起来像是在 GlassFish 社区开发的 TopLink Essentials 中的一个错误。实际上,我认为此问题已在Issue #627中报告(“Column annotation insertable=false only works with updatable=false”)。可悲的是,它不是固定的,所以我建议:

  • 使用private String m_firstName = "my database default";(是的,这很丑)-或者-
  • 更改持久性提供程序(对于 OpenJPA、Hibenate)
于 2010-02-08T17:25:59.607 回答
0

您可以尝试不使用@Basic(optional = true),因为它映射NULLABLE(在您的情况下这似乎是错误的)?

定义字段或属性的值是否可以为空。

于 2010-02-06T01:23:54.480 回答