关于getter无效的JPA @Column注释

时间:2016-01-12 03:48:59

标签: java mysql spring hibernate jpa

这是方案

@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

2 个答案:

答案 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);
}