我正在做一个学校项目,构建微服务来管理其他微服务。
我们使用 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>
如果需要任何其他代码或资源来解决此问题,请告诉我。几天来我一直在努力寻找解决方案,但我无法在任何地方找到答案。