我有一个数据库布局,我的员工和我的近亲都有地址。
所以我的钥匙布局如下:
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 ..
答案 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>
“对于所有可为空的列,JDBC都需要JDBC类型,如果为null 作为值传递。您可以通过阅读来自行调查 PreparedStatement.setNull()方法的JavaDocs。“
答案 1 :(得分:-1)
你可以插入一个假地址获取值并使用用户的id更新真实地址吗? 你可以改变db的约束吗?