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应该为空。

当我插入一条记录时,我收到“列'addressID'不能为空”的错误。当我将它从插入语句中取出时,它会引发错误“字段'addressID'没有默认值”。

我希望能够添加一个员工,然后再添加地址和关系..

这是布置表格/关系的坏方法吗?我似乎找不到将地址存储为空的方法..

4

2 回答 2

0

APC 是对的:您在数据库中将 employees.AddressID 定义为 NOT NULL。这会导致错误“列 'addressID' 不能为空”。如果要在数据库中存储 Java 空引用,则必须允许该列的 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 文档

“如果将 null 作为值传递,则 JDBC 对所有可空列都需要 JDBC 类型。您可以通过阅读 PreparedStatement.setNull() 方法的 JavaDocs 自行调查。”

于 2016-03-10T16:58:15.040 回答
-1

您可以插入一个假地址获取值并使用用户的 id 更新真实地址吗?你能改变对数据库的约束吗?

于 2013-03-07T15:15:19.420 回答