0

私の従業員と近親者の両方が住所を持っているデータベースレイアウトがあります。

したがって、私のキーは次のように配置されます。

Address
----------
addressID


Employee
----------
employeeID
addressID


NextOfKin
----------
nextOfKinID
addressID

MyBatisでは、次のように関連付けを設定しています。

<resultMap id="employeeMap" type="employee">
    <id column="employeeID" property="employeeID" />

    <association property="address" column="addressID" resultMap="addressMap" />
</resultMap>

<resultMap id="addressMap" type="address">
    <id column="addressID" property="addressID" />
</resultMap>

これは挿入ステートメントです。employeeIDは自動増分なので、省略しました。

<insert id="insert">
INSERT into Employees (addressID)
    VALUES (#{address.addressID})
</insert>

従業員オブジェクト:

Employee{
  int employeeID
  Address address
}

したがって、従業員が登録してアカウントを設定するとき、彼らはまだ住所を持っていません。したがって、addressIDはnullである必要があります。

レコードを挿入すると、「列'addressID'をnullにすることはできません」というエラーが表示されます。そして、挿入ステートメントからそれを取り出すと、「フィールド'addressID'にはデフォルト値がありません」というエラーがスローされます。

従業員を追加して、後で住所と関係を追加できるようにしたいと思います。

これはテーブル/関係をレイアウトするための悪い方法ですか?アドレスをnullとして保存する方法が見つからないようです。

4

2 に答える 2

0

APC は正しいです。データベースで employees.AddressID を NOT NULL として定義しました。これにより、「Column 'addressID' cannot be null」というエラーが発生します。Java null 参照をデータベースに格納する場合は、その列に NULL 値を許可する必要があります。

また、MyBatis に address.addressID の SQL タイプを伝える必要があります。たとえば、タイプ INT の変更の場合

<insert id="insert">
INSERT into Employees (addressID)
    VALUES (#{address.addressID})
</insert>

<insert id="insert">
INSERT into Employees (addressID)
    VALUES (#{address.addressID, jdbcType=NUMERIC})
</insert>

MyBatis-Documentationを参照してください:

「null が値として渡される場合、JDBC タイプはすべての null 許容列に対して JDBC によって必要とされます。PreparedStatement.setNull() メソッドの JavaDocs を読んで、これを自分で調べることができます。」

于 2016-03-10T16:58:15.040 に答える
-1

偽のアドレスを挿入して値を取得し、ユーザーの ID を使用して実際のアドレスを更新できますか? データベースの制約を変更できますか?

于 2013-03-07T15:15:19.420 に答える