这是方案
@Transient
private Map<String, String> choices = null;
@Column(name = "choices", nullable = false)
public String getChoices() {
return gson.toJson(choices);
}
在插入记录时,它说
java.sql.SQLException:字段&#39;选择&#39;没有默认值
我的DEBUG SQL
DEBUG SQL:109 -
insert
into
question
(description, id)
values
(?, ?)
此处选择选项字段。
数据库详细信息:
CREATE TABLE `question` (<br/>
`id` varchar(50) COLLATE utf8_bin NOT NULL,<br/>
`description` varchar(1000) COLLATE utf8_bin NOT NULL,<br/>
`choices` text COLLATE utf8_bin NOT NULL,<br/>
`answers` varchar(100) COLLATE utf8_bin NOT NULL<br/>
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;<br/>
<br/>
ALTER TABLE `question`<br/>
ADD PRIMARY KEY (`id`);<br/>
有人可以帮助我为什么会忽略这些领域? 谢谢。
[UPDATES] 实体类:
@Entity
@Table(name = "question")
public class Question {
@Id
private String id = null;
@Column(name = "description", nullable = false)
private String description = null;
@Transient
@Column(name = "choices", nullable = false)
private Map<String, String> choices = null;
public String getChoices() {
return gson.toJson(choices);
}
@Transient
private Set<String> answers = null;
@Transient
private Gson gson = new GsonBuilder().create();
public Question() {
this.id = UUID.randomUUID().toString();
}
...
}//End of class
答案 0 :(得分:1)
在create table中,您已将choices列标记为null。 choices text COLLATE utf8_bin NOT NULL,
因此例外。
当您持久化Question实体类时,您不提供选项的值,因此它们不包含在生成的sql中。要么为选项提供值,要么在数据库中的列上删除非空约束。
注释属性javax.persistence.Transient
在JPA中将其标记为非持久性,并且不会包含在结果SQL中。
答案 1 :(得分:0)
您可以简单地使用JPA注释@MapKey(请注意,JPA注释与Hibernate注释不同,Hibernate @MapKey会映射一个包含地图键的数据库列,而JPA的注释会映射该属性以用作map的密钥)。使用映射为:
@javax.persistence.MapKey(name = "choices ")
private Map<String, String> choices = new HashMap<String, String>();
public String getChoices() {
return gson.toJson(choices);
}