持久化后找不到Hibernate(OGM + MongoDB)实体

时间:2015-05-03 21:42:50

标签: hibernate mongodb jpa tomee hibernate-ogm

我正在开展一个学校项目,构建微服务来管理其他微服务。

我们正在使用Apache Tomee,Hibernate OGM与MongoDB提供程序和Arquillian进行测试。我们管理的服务器使用ActiveMQ和JMS在微服务之间以任务的形式运行docker和messaging。我们还将这些任务保存到数据库中,以便稍后处理信息。

尽管如此,我们遇到了以下问题:除非数据库连接被破坏并重新连接,否则将找不到先前保留的实体。

以下是保存/删除的一些代码:

public void persist(Object entity) {
    em.getTransaction().begin();
    em.persist(entity);
    em.flush();
    em.getTransaction().commit();
}

public void deleteTask(String id) {
    em.getTransaction().begin();
    Task task = em.find(Task.class, id);
    if(task.getServer() != null && task.getServer().getTasks() != null) {
        task.getServer().getTasks().remove(task);
        em.merge(task.getServer());
    }

    if(task.getProject() != null) {
        // Stub for when tasks are added to the project
    }

    if(task.getImage() != null && task.getImage().getTasks() != null) {
        task.getImage().getTasks().remove(task);
        em.merge(task.getImage());
    }
    em.remove(task);
    em.getTransaction().commit();
}

正如您在上面的示例中所看到的,我们还必须在真正删除实体之前对关系进行大量检查。不知怎的,Hibernate没有关联。

这些是我们的实体:

@Entity
public class Task {
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    private String id;

    @NotNull
    @Enumerated(EnumType.STRING)
    private TaskType taskType;

    @ManyToOne
    @NotNull
    private Server server;

    @ManyToOne
    @Expose(serialize = false, deserialize = false)
    private Project project;

    @ManyToOne
    private Image image;

    @OneToOne
    private TaskResult taskResult; 
}

和相关的图像作为例子:

public class Image {
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    private String id;

    @Size(min = 5, max = 100)
    private String name;

    @Size(min = 5, max = 200)
    private String dockerUrl;

    @Size(min = 1, max = 40)
    private String version;

    @OneToMany(mappedBy = "image")
    private List<Task> tasks;

    @ManyToOne
    private Project project;
}

最后但并非最不重要:我们的persistence.xml

<persistence-unit name="dockingstationPu" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>

    <properties>
        <property name="hibernate.ogm.datastore.provider" value="mongodb" />
        <property name="hibernate.ogm.datastore.database" value="dockingstation" />
        <property name="hibernate.ogm.datastore.host" value="mongo.service.consul" />
        <property name="hibernate.ogm.datastore.document.association_storage" value="ASSOCIATION_DOCUMENT"/>
        <property name="hibernate.ogm.mongodb.association_document_storage" value="COLLECTION_PER_ASSOCIATION"/>
    </properties>
</persistence-unit>

如果需要任何其他代码或资源来解决此问题,请与我们联系。我已经尽力找到解决方案已有几天了,但我无法在任何地方找到答案。

0 个答案:

没有答案