我正在开展一个学校项目,构建微服务来管理其他微服务。
我们正在使用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>
如果需要任何其他代码或资源来解决此问题,请与我们联系。我已经尽力找到解决方案已有几天了,但我无法在任何地方找到答案。