简体   繁体   English

@MappedSuperClass和Dropwizard的休眠未知实体异常

[英]Hibernate Unkown Entity Exception with @MappedSuperClass and Dropwizard

theres an exception I cannot get rid of. 我无法摆脱一个例外。

I have an entity: 我有一个实体:

package mypackage.entities;

import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "raw_air_pressure")
public class RawAirPressureData extends RawSensorData {

    @Override
    public String toString() {
        [...]
    }
}

With its superclass: 具有其超类:

package mypackage.entities;

import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import javax.validation.constraints.NotNull;

@MappedSuperclass
public abstract class RawSensorData extends BaseSensorData {

    @Column(name = "timestamp")
    @NotNull
    private Long timestamp;

    public Long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Long timestamp) {
        this.timestamp = timestamp;
    }

    @Override
    public int hashCode() {
        [...]
    }

    @Override
    public boolean equals(Object obj) {
        [...]
    }
}

With its superclass: 具有其超类:

package mypackage.entities;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;

import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

@MappedSuperclass
public abstract class BaseSensorData {

    @Id
    @SequenceGenerator(name = "my_seq", sequenceName = "my_seq", allocationSize = 1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="my_seq")
    @Column(name = "id")
    private Integer id;

    @Column(name = "value")
    @NotNull
    private Float value;

    @CreationTimestamp
    @Column(name = "created")
    @Temporal(TemporalType.TIMESTAMP)
    private Date created;

    @UpdateTimestamp
    @Column(name = "updated")
    @Temporal(TemporalType.TIMESTAMP)
    private Date updated;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Float getValue() {
        return value;
    }

    public void setValue(Float value) {
        this.value = value;
    }

    public Date getCreated() {
        return created;
    }

    public void setCreated(Date created) {
        if(created != null) {
            this.created = created;
        }
    }

    public Date getUpdated() {
        return updated;
    }

    public void setUpdated(Date updated) {
        if(updated != null) {
            this.updated = updated;
        }
    }

    @Override
    public int hashCode() {
        [...]
    }

    @Override
    public boolean equals(Object obj) {
        [...]
    }   
}

The entity is registered for hibernate (dropwizard style): 该实体已注册为休眠状态(dropwizard样式):

private static final HibernateBundle<MyServerConfiguration> hibernate = new HibernateBundle<MyServerConfiguration>(
    MyEntity1.class, MyEntity2.class, [...],
    RawAirPressureData.class) {

@Override
    public DataSourceFactory getDataSourceFactory(MyServerConfiguration configuration) {
        return configuration.getDataSourceFactory();
    }
};

When doing this JUnit: 在执行此JUnit时:

@Test
    public void testRawAirPressureData() {
        RawAirPressureData myData = TestUtils.generateTestRawAirPressureData();

        RawAirPressureData testMyData = database.inTransaction(() -> {
            return rawAirPressureDataDAO.persist(myData );
        });
[...]

I am getting this Exception: 我收到此异常:

org.hibernate.MappingException: Unknown entity: mypackage.entities.RawAirPressureData at org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:620) at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1635) at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:225) at org.hibernate.event.internal.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:499) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:83) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:660) at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:652) at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:647) at io.dropwizard.hibernate.AbstractDAO.persist(AbstractDAO.java:202) at mypackage.db org.hibernate.MappingException:未知实体:org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1635)上的org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:620)上的mypackage.entities.RawAirPressureData在org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:225)在org.hibernate.event.internal.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:499)在org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate (DefaultSaveOrUpdateEventListener.java:83)在org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)在org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:660)在org.hibernate.internal。在mypackage.db上的org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:647)在io.dropwizard.hibernate.AbstractDAO.persist(AbstractDAO.java:202)处的SessionImpl.saveOrUpdate(SessionImpl.java:652) .BaseSensorDataDAO.persist(BaseSensorDataDAO.java:33) at mypackage.db.BaseSensorDataDAOTest.lambda$testRawAirPressureData$6(BaseSensorDataDAOTest.java:196) .baseSensorDataDAO.persist(BaseSensorDataDAO.java:33)在mypackage.db.BaseSensorDataDAOTest.lambda $ testRawAirPressureData $ 6(BaseSensorDataDAOTest.java:196)

All previous entities work fine. 以前所有的实体都可以正常工作。 But none of them consists of mappedsuperclass. 但是它们都不是由mappingsuperclass组成的。 I do not understand whats going wrong here. 我不明白这里出了什么问题。

Any help would be grateful. 任何帮助将不胜感激。

The problem was that in the Unit Test the dataset was created with giving an ID, although the sequence is gonna be used. 问题是,尽管将使用序列,但在单元测试中,数据集是通过给出ID来创建的。 Due to that its seems that it stores the recordat first with the given ID and then tries to overwrite it by the sequence which led to to optimisitcLockException. 由于这个原因,它似乎首先用给定的ID存储了recordat,然后尝试按导致optimisitcLockException的顺序覆盖它。

After erasing the set of the ID in the testdata, the sequence had the way free and it worked. 删除测试数据中的ID集后,该序列就可以自由运行了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM