使用外键插入记录。目前还没有外国数据。数据库布局问题?

时间:2013-03-07 14:37:15

标签: java database database-design mybatis

我有一个数据库布局,我的员工和我的近亲都有地址。

所以我的钥匙布局如下:

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。

当我插入记录时,我收到一个错误,即“列'地址ID'不能为空”。 当我从插入语句中取出它时会抛出错误“字段'地址ID'没有默认值”。

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

这是制定表格/关系的不好方法吗?我似乎无法找到一种方法将地址存储为null ..

2 个答案:

答案 0 :(得分:0)

APC是对的:您在数据库中将employees.AddressID定义为NOT NULL。这导致错误“列'地址ID'不能为空”。如果要在数据库中存储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-Documentation

  

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

答案 1 :(得分:-1)

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

相关问题