Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql HibernateException:实例的标识符已从Alert@62794582到Alert@c82ad22_Postgresql_Hibernate_Jpa_Jsonb_Usertype - Fatal编程技术网

Postgresql HibernateException:实例的标识符已从Alert@62794582到Alert@c82ad22

Postgresql HibernateException:实例的标识符已从Alert@62794582到Alert@c82ad22,postgresql,hibernate,jpa,jsonb,usertype,Postgresql,Hibernate,Jpa,Jsonb,Usertype,我正在使用Hibernate JPA实现持久性API。 我正在使用PostgreSQL 10.4并将数据存储为JSONB。 我正在分享我的Hibernate和Entity的实现,请指出为什么我会出现以下异常 由于Hibernate不支持PostgreSQL JSONB数据类型,我将在下面这篇精彩的文章中实现自定义用户类型: 我能够创建实体映射,执行简单的Select查询并打印分配给映射的值 问题是,当我对事务执行提交操作时,会出现以下异常: 22:42:35.218[主]调试 org.hibe

我正在使用Hibernate JPA实现持久性API。
我正在使用PostgreSQL 10.4并将数据存储为JSONB。
我正在分享我的Hibernate和Entity的实现,请指出为什么我会出现以下异常

由于Hibernate不支持PostgreSQL JSONB数据类型,我将在下面这篇精彩的文章中实现自定义用户类型:

我能够创建实体映射,执行简单的Select查询并打印分配给映射的值

问题是,当我对事务执行提交操作时,会出现以下异常:

22:42:35.218[主]调试 org.hibernate.engine.transaction.internal.TransactionImpl-rollback() 在线程“main”中的非活动事务异常上调用 javax.persistence.RollbackException:提交 交易地点 org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:86) 在com.postgres.main.TestMain.main(TestMain.java:41)上,由以下原因引起: javax.persistence.PersistenceException: org.hibernate.HibernateException: com.postgres.model.Alert已从 com.postgres.model。Alert@62794582转到com.postgres.model。Alert@c82ad22 在 org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1692) 在 org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602) 在 org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:67) ... 1更多原因:org.hibernate.HibernateException:的标识符 com.postgres.model.Alert的实例已从 com.postgres.model。Alert@62794582转到com.postgres.model。Alert@c82ad22 在 org.hibernate.event.internal.DefaultFlushentyEventListener.checkId(DefaultFlushentyEventListener.java:64) 在 org.hibernate.event.internal.DefaultFlushentyEventListener.getValues(DefaultFlushentyEventListener.java:175) 在 org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:135) 在 org.hibernate.event.internal.AbstractFlushingEventListener.Flushenties(AbstractFlushingEventListener.java:216) 在 org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:85) 在 org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:38) 位于org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1295) 在 org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:468) 在 org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3135) 在 org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2352) 在 org.hibernate.engine.jdbc.internal.jdbcoordinatorimpl.beforeTransactionCompletion(jdbcoordinatorimpl.java:485) 在 org.hibernate.resource.transaction.backend.jdbc.internal.jdbResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(jdbResourceLocalTransactionCoordinatorImpl.java:147) 在 org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38) 在 org.hibernate.resource.transaction.backend.jdbc.internal.jdbResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(jdbResourceLocalTransactionCoordinatorImpl.java:231) 在 org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65) 在 org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:61) ... 还有一个

我还关注了下面的帖子,大家分享了他们是如何解决这个问题的,但这对我没有帮助:

这是警报实体:

@Entity
@IdClass(Alert.class)
@Table(name = "alert")
public class Alert implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "historyid")
    private Character historyId;

    @Id
    @Column(name = "tenantname")
    private Character tenantName;

    @Column(name = "data")
    @Type(type = "AlertJsonUserType")
    private AlertJson alertJson;

    public Character getHistoryId() {
        return historyId;
    }

    public void setHistoryId(Character historyId) {
        this.historyId = historyId;
    }

    public Character getTenantName() {
        return tenantName;
    }

    public void setTenantName(Character tenantName) {
        this.tenantName = tenantName;
    }

    public AlertJson getAlertJson() {
        return alertJson;
    }

    public void setAlertJson(AlertJson alertJson) {
        this.alertJson = alertJson;
    }
}

这是警报实体中JSONB元素的实体

public class AlertJson implements Serializable 
{
    private static final long serialVersionUID = 1L;

    @JsonProperty("DeviceId")
    private String deviceId;

    @JsonProperty("TenantName")
    private String tenantName;

    @JsonProperty("FocusPointId")
    private List<FocusPointId> focusPointId;

    public String getDeviceId() {
        return deviceId;
    }

    public void setDeviceId(String deviceId) {
        this.deviceId = deviceId;
    }

    public String getTenantName() {
        return tenantName;
    }

    public void setTenantName(String tenantName) {
        this.tenantName = tenantName;
    }

    public List<FocusPointId> getFocusPointId() {
        return focusPointId;
    }

    public void setFocusPointId(List<FocusPointId> focusPointId) {
        this.focusPointId = focusPointId;
    }
}

class FocusPointId
{
    @JsonProperty("PartNumber")
    private String partNumber;

    @JsonProperty("SerialNumber")
    private String serialNumber;

    public String getPartNumber() {
        return partNumber;
    }

    public void setPartNumber(String partNumber) {
        this.partNumber = partNumber;
    }

    public String getSerialNumber() {
        return serialNumber;
    }

    public void setSerialNumber(String serialNumber) {
        this.serialNumber = serialNumber;
    }
  }
公共类AlertJson实现可序列化
{
私有静态最终长serialVersionUID=1L;
@JsonProperty(“设备ID”)
私有字符串设备ID;
@JsonProperty(“租户名称”)
私有字符串租户名称;
@JsonProperty(“焦点点ID”)
私有列表焦点ID;
公共字符串getDeviceId(){
返回设备ID;
}
公共无效setDeviceId(字符串deviceId){
this.deviceId=deviceId;
}
公共字符串getTenantName(){
返回租户名称;
}
public void settnantName(字符串tenantName){
this.tenantName=tenantName;
}
公共列表getFocusPointId(){
返回焦点;
}
public void setFocusPointId(列出focusPointId){
this.focusPointId=focusPointId;
}
}
类焦点点ID
{
@JsonProperty(“零件号”)
私有字符串部件号;
@JsonProperty(“序列号”)
私有字符串序列号;
公共字符串getPartNumber(){
返回零件号;
}
公共无效集合零件号(字符串零件号){
this.partNumber=零件号;
}
公共字符串getSerialNumber(){
返回序列号;
}
公共无效设置序列号(字符串序列号){
this.serialNumber=serialNumber;
}
}

下面是main()的一段代码,我在其中创建EntityManager实例并发出查询

public static void main(String[] args)
{
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");

    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();

    Query alertQuery = em.createNativeQuery("SELECT * FROM \"A.01\".\"Alert\" where tenantname = 'TestUser-152'", Alert.class);
    List<Alert> alertList = alertQuery.getResultList();

    for(Alert jsonElement : alertList)
    {
        System.out.println("======> "+"Device: " + jsonElement.getAlertJson().getDeviceId() + " TenantName: " +jsonElement.getAlertJson().getTenantName());
    }

    em.getTransaction().commit();

    emf.close();
}
publicstaticvoidmain(字符串[]args)
{
EntityManagerFactory emf=Persistence.createEntityManagerFactory(“我的持久化单元”);
EntityManager em=emf.createEntityManager();
em.getTransaction().begin();
Query alertQuery=em.createNativeQuery(“从\“A.01\”\“Alert\”中选择*,其中tenantname='TestUser-152',Alert.class);
名单


我认为您有这个问题,因为您错误地使用了
IdClass
注释,您应该创建一个单独的类
AlertId
,例如,它必须从您的c