【问题标题】:WildFly/Hibernate: update an embedded property failedWildFly/Hibernate:更新嵌入式属性失败
【发布时间】:2021-04-26 13:43:23
【问题描述】:

目前,我正在尝试将eclipse-ee4j/cargotracker(最初是 Eric 的 DDD 书籍样本的重写版本)更新到最新的 Jakarta EE 8:

https://github.com/hantsy/cargotracker/tree/jakartaee8

就个人而言,我想扩展 WildFly 作为替代应用程序服务器。但是我在 Payara/ElipseLInks 和 WildFly/Hibernate 之间遇到了几个有线问题。

有一个 Cargo 实体具有 RouteSepcificaiton 可嵌入属性,该属性具有出发和到达 Location(实体)和到达截止日期。

关系的虚拟代码片段:

@Entity class Cargo{
    @Embedded routeSepcification;
}

@Embedable class RouteSpecificition{
    @ManyToOne Location origin
    @ManyToOne Location destination
}
@Entity class Location{}

书新货很好用,但是当我想用cargo.specifyNewRoute换成新航线,也就是更新航线规范时,并没有按预期更新。

完整的测试代码是here

startTransaction();
        var trackingId = new TrackingId("AAA");
        Cargo cargo = cargoRepository.find(trackingId);

        assertThat(cargo).isNotNull();

        Location origin = locationRepository.find(SampleLocations.NEWYORK.getUnLocode());
        Location destination = locationRepository.find(SampleLocations.HELSINKI.getUnLocode());

        cargo.specifyNewRoute(new RouteSpecification(origin, destination, LocalDate.now()));

        cargoRepository.store(cargo);
        commitTransaction();

        //verify in the new tx
        startTransaction();
        var result = this.entityManager.createQuery("select c from Cargo c where c.trackingId=:trackingId", Cargo.class)
                .setParameter("trackingId", trackingId)
                .getSingleResult();

        assertThat(result.getTrackingId()).isEqualTo(trackingId);
        assertThat(result.getRouteSpecification().getOrigin()).isEqualTo(origin);
        assertThat(result.getRouteSpecification().getDestination()).isEqualTo(destination);
        assertThat(result.getItinerary().getLegs()).hasSize(1);

        commitTransaction();

Arquillian 测试在 WildFly/Hibernate 上失败,但在 Payara/EclipseLinks 上通过

【问题讨论】:

    标签: hibernate jpa wildfly


    【解决方案1】:

    您是否为Location 实体实现了equals 方法?

    如果不是,我认为测试失败是因为 EntityManager 用于检索 origindestination 然后更新 Cargo 与您尝试检索时在第二个事务块中使用的不同更新了Cargo,因此destinationorigin 位置的两个新实例由第二个EntityManager 创建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2015-12-08
      相关资源
      最近更新 更多