5

EJB3 と Oracle Express Edition DB を使用して J2SE アプリケーションを構築しています。

私の問題はそのようなものです-DBのテーブルと一致するプロジェクトに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

4 に答える 4

1

次の注釈付き:

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

SQL挿入を生成するときは、このFIRST_NAME列を完全に無視する必要があります。言い換えれば、これはGlassFishコミュニティで開発されたTopLinkEssentialsのバグのように聞こえます。実際、この問題は問題#627で報告されていると思います(「列注釈insertable = falseは、updatable = falseで使用した場合にのみ機能します」)。残念ながら、修正されていないので、次のことをお勧めします。

  • 使用するprivate String m_firstName = "my database default";(はい、これは醜いです)-または-
  • 永続性プロバイダーを変更するには(OpenJPA、Hibenateの場合)
于 2010-02-08T17:25:59.607 に答える
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

insertable と updateable の両方が false の場合、TopLink Essentials は列のみを省略します。

これは EclipseLink で修正されているため、アップグレードを検討する必要があります。

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

于 2011-05-12T13:34:58.630 に答える
0

@Basic(optional = true)なしで試すことはできますNULLABLE? (あなたの場合は間違っているようです)

フィールドまたはプロパティの値が null になる可能性があるかどうかを定義します。

于 2010-02-06T01:23:54.480 に答える