源实体中使用@JoinColumn指定外键(为参考实体的主键):
@ManyToOne(cascade={CascadeType.REFRESH,CascadeType.DETACH},
optional=true, fetch = FetchType.LAZY)
@JoinColumn(name="DD_TYPE_ID")
private FieldDropdownType type;
参考的FieldDropdownType 实体的主键:
@Id
@Column(name="DD_TYPE_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long ddTypeId;
问题:
浏览器端传递的json部分如下:
{
"id": 10,
...,
"type": {
"ddTypeId": 1
},
...
}
这是插入一条源实体的数据记录,id为源实体的主键值,type为@JoinColumn注解的属性,参考实体中存在ddTypeId为1的列。但请求时,服务端提示:
**[RMI TCP Connection(4)-192.168.2.37] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1048, SQLState: 23000
[RMI TCP Connection(4)-192.168.2.37] ERROR org.hibernate.util.JDBCExceptionReporter - Column 'DD_TYPE_ID' cannot be null
javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not insert: **
即DD_TYPE_ID列不能为空,但不是通过type属性传递了吗?如果不是这样传递,外键列的值应该是怎么设置的?
补充一下,最不懂的是,@JoinColumn注释后,列的值不就变成实体了?但数据表中定义的是基本类型啊?这怎么理解呢,要插入的该外键列的值到底从哪获得,以及如何插入?
其实是一个判断条件写错了,哈哈,不过@JoinColumn指定的外键约束似乎没什么用,被依赖表的参考列不存在相应记录时,还是可以正常插入。。。。
@JoinColumn有用的,关键在于optional参数配错了,貌似还有个什么注解可以去掉必需性检查
我也在找原因,但是把外键设置为可以为空时,数据还是能插进去的,而且外键也有值,搞不明白 Jpa咋配置的