【问题标题】:Spring-Roo JPA created entity not updatingSpring-Roo JPA 创建的实体未更新
【发布时间】:2016-10-25 08:41:38
【问题描述】:

我正在编写“Spring Roo in Action”一书中的代码,但遇到了问题。根据这本书,我正在生成两个 JPA 实体,产品和课程; course to offer 是一对多的依赖关系。

使用 Roo 命令外壳,我生成了两个实体之间的关系:

focus --class ~.model.Course

field set --fieldName offerings --type ~.model.Offering --cardinality ONE_TO_MANY --mappedBy "course"

focus --class ~.model.Offering

field reference --fieldName course --type ~.model.Course --cardinality MANY_TO_ONE

这已经生成了带有注释的类代码产品:

@RooJavaBean
@RooToString
@RooJpaActiveRecord
public class Offering {
/**
 */
@NotNull
@Temporal(TemporalType.TIMESTAMP)
@DateTimeFormat(style = "M-")
private Date offerDate;

/**
 */
@NotNull
@Size(min = 1, max = 80)
private String locationName;

/**
 */
@ManyToOne
private Course course;

}

课程的课程代码:

@RooJavaBean
@RooToString
@RooJpaActiveRecord
public class Course {

    /**
     */
    private String name;

    /**
     */
    private BigDecimal listPrice;

    /**
     */
    private String description;

    /**
     */
    private Integer maximumCapacity;

    /**
     */
    @Temporal(TemporalType.DATE)
    @DateTimeFormat(style = "S-")
    private Date runDate;

    /**
     */
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "course")
    private Set<Offering> offerings = new HashSet<Offering>();

    /**
     */
    @ManyToOne
    private TrainingProgram trainingProgram;
}

现在,当我运行集成测试时,它失败了,似乎课程是持久的,但产品不是。一个 Offer 应该已被持久化,然后从数据库中检索,但没有返回:

    @Test
    public void addCourseAndOffering(){
        CourseDataOnDemand courseDod = new CourseDataOnDemand();
        Course course = courseDod.getNewTransientCourse(0);
        course.setListPrice(new BigDecimal("100.00"));

        OfferingDataOnDemand offerDod = new OfferingDataOnDemand();
        Offering offer = offerDod.getNewTransientOffering(0);

        course.getOfferings().add(offer);

        course.persist();
        course.flush();
        course.clear();

        Course persistedCourse = Course.findCourse(course.getId());
        Assert.assertNotNull(persistedCourse.getId());
        Assert.assertEquals(course.getListPrice(), persistedCourse.getListPrice());
        Set<Offering> offers = persistedCourse.getOfferings();
        int size = offers.size();
        Assert.assertEquals(1, persistedCourse.getOfferings().size());
    }
}

Assertion Failure

有人可以告诉我我在这里做错了什么吗?

【问题讨论】:

  • 您使用的是哪个 Roo 版本?请多描述一下你的环境。
  • 对不起; Spring Roo Release 1.3.2 在 STS 版本 3.8.1 上运行
  • 后端数据库也是 windows-x64 上的 postgresql 版本 9.6.0-rc1。

标签: java postgresql hibernate jpa spring-roo


【解决方案1】:

尝试在持久化之前设置offer.course:在JPA 中,处理双向关系应该由应用程序完成,而不是由库实现。请参阅this page [Getters 和 Setters 部分])

由于关系是双向的,因此应用程序更新关系的一侧,另一侧也应该得到更新,并保持同步。 在 JPA 中,就像在 Java 中一般由应用程序或对象模型负责维护关系。如果您的应用程序添加到关系的一侧,那么它必须添加到另一侧。

所以试试这个:

@Test
public void addCourseAndOffering(){
    CourseDataOnDemand courseDod = new CourseDataOnDemand();
    Course course = courseDod.getNewTransientCourse(0);
    course.setListPrice(new BigDecimal("100.00"));

    OfferingDataOnDemand offerDod = new OfferingDataOnDemand();
    Offering offer = offerDod.getNewTransientOffering(0);

    course.getOfferings().add(offer);

    // ==================================
    offer.setCourse(course); // XXX set the offer-side relationship part
    // ==================================

    course.persist();
    course.flush();
    course.clear();

    Course persistedCourse = Course.findCourse(course.getId());
    Assert.assertNotNull(persistedCourse.getId());
    Assert.assertEquals(course.getListPrice(), persistedCourse.getListPrice());
    Set<Offering> offers = persistedCourse.getOfferings();
    int size = offers.size();
    Assert.assertEquals(1, persistedCourse.getOfferings().size());
}

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2014-02-10
    • 2019-02-09
    • 2018-04-13
    • 2015-03-15
    相关资源
    最近更新 更多