首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring-Roo JPA创建的实体未更新

Spring-Roo JPA创建的实体未更新
EN

Stack Overflow用户
提问于 2016-10-25 16:41:39
回答 1查看 163关注 0票数 0

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

使用Roo命令shell,我已经生成了两个实体之间的关系,如下所示:

代码语言:javascript
复制
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

这样就生成了带有注释的类代码:

代码语言:javascript
复制
@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;

}

和课程的类代码:

代码语言:javascript
复制
@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;
}

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

代码语言:javascript
复制
    @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

有人能告诉我这里哪里做错了吗?

EN

回答 1

Stack Overflow用户

发布于 2016-11-08 00:29:29

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

因为关系是双向的,所以当应用程序更新关系的一端时,另一端也应该得到更新,并保持同步。在JPA中,就像在Java中一般的一样,它是应用程序或对象模型的责任来维护关系。如果您的应用程序添加到关系的一方,那么它必须添加到另一方。

所以试试这个:

代码语言:javascript
复制
@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());
}

祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40235298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档