EJB3 - @Column(insertable =“false”)问题

时间:2010-02-05 23:06:37

标签: java jpa ejb-3.0 toplink-essentials ora-01400

我正在使用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 个答案:

答案 0 :(得分: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中报告(“列注释insertable = false仅在与updatable = false”一起使用时才有效)。可悲的是,它没有固定,所以我建议:

  • 使用private String m_firstName = "my database default";(是的,这很难看) - 或 -
  • 更改持久性提供程序(对于OpenJPA,Hibenate)

答案 1 :(得分:1)

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

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


}

答案 2 :(得分:1)

如果您同时具有insertable和updateable = false,则TopLink Essentials将仅省略该列。

这已在EclipseLink中修复,因此您应该考虑升级。

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

答案 3 :(得分:0)

您可以在没有@Basic(optional = true)的情况下尝试,因为that mapsNULLABLE(在您的情况下似乎是错误的)?

  

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