如何使用JPA将JSONB存入Postgres数据库

5

我正在尝试使用Jersey、Gson和JPA构建一个REST应用程序,并希望将JSON对象放入Postgres的JSON或JSONB数据库字段中。

我尝试做类似这样的事情:如何在JPA中使用Postgres JSONB数据类型?,但我的表看到的是'VARCHAR'类型而不是'JSONB'。

我的实体:

@Entity
@Table(name = "votes")

public class Votes {

@Id
@GeneratedValue
private int id;
private int idSocialChoice;

@Convert(converter=JsonConverter.class)
private JsonObject vote;

public Votes() {
}

public JsonObject getVote() {
    return vote;
}

public void setVote(JsonObject vote) {
    this.vote = vote;
}

public int getIdSocialChoice() {
    return idSocialChoice;
}

public void setIdSocialChoice(int idSocialChoice) {
    this.idSocialChoice = idSocialChoice;
}

如何插入实体:
Votes votes0 = new Votes();
votes0.setIdSocialChoice(3);

JsonObject object = Json.createObjectBuilder().build();
votes0.setVote(object);

List<Votes> listvotes = new ArrayList<Votes>();
listvotes.add(votes0);

ModelEntities.insertVotes(listvotes);

方法 insertVotes:

public static void insertVotes(List<Votes> animalList) {

    CrudServiceBean crudServiceBean = new CrudServiceBean(CrudServiceBean.PU_DB);
    crudServiceBean.newTransaction();

    for(Votes votes : animalList)
        crudServiceBean.create(votes);

    crudServiceBean.commit();

    crudServiceBean.closeTransaction();

}

crudServiceBean.create 的 create 方法:

public  <T> T create(T t) {
    this.em.persist(t);
    this.em.flush();
    this.em.refresh(t);
    return t;
}

我的JPA提供者创建了这样的模式(createDDL_ddlGeneration.sql):

CREATE TABLE votes (ID INTEGER NOT NULL, IDSOCIALCHOICE INTEGER, VOTE VARCHAR(255), PRIMARY KEY (ID))

我也会避免使用Hibernate。

谢谢。


“它不起作用”(TM)。我确定一定会发生某些事情,可能是异常,可能是日志中的SQL,但仅说“它不起作用”对于在此处诊断您的问题的人来说没有多大用处。 - Neil Stockton
@NeilStockton 我已经将JsonConverter类添加到我的项目中,但我不知道我需要在实体属性值中放置哪个注释。因此,现在我在属性上有“'Basic'属性类型不应该是一个映射”的错误提示。 - Pierre Rol
@NeilStockton 好的,我已经添加了所需的注释。现在一切都正常,除了我的数据库检测到一个“BYTEA”而不是“jsonb”。 - Pierre Rol
这是什么意思?你创建了模式吗?还是你的JPA提供程序创建了它?如果是后者,请发布所创建的模式以及创建过程。然后再发布使用的SQL。 - Neil Stockton
@NeilStockton 谢谢你的一切 :). 这正是我所缺少的。 - Pierre Rol
显示剩余3条评论
1个回答

7
我终于找到了问题所在。我忘记在属性中加入了这行代码:
@Column (nullable = true, columnDefinition = "jsonb")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接