1

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

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

但是,我们遇到了以下问题:除非数据库连接被破坏并重新连接,否则将找不到以前持久化的实体。

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

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>

如果需要任何其他代码或资源来解决此问题,请告诉我。几天来我一直在努力寻找解决方案,但我无法在任何地方找到答案。

4

0 回答 0