2016-10-25 12 views
0

我正在研究“Spring Roo in Action”一书中的代码,我遇到了一个问题。根据这本书,我产生了两个JPA实体,Offering和Course;提供的过程是一对多的依赖关系。Spring-Roo JPA创建的实体不更新

使用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; 
} 

现在,当我运行集成测试时,它失败了,看起来课程仍然存在,但发售并非如此。一个提议应该被坚持,然后从数据库中检索,但没有返回:

@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

可能有人请指教一下我做错了吗?

+0

您使用的是哪个Roo版本?请描述一下你的环境。 – eruiz

+0

对不起,在STS 3.8.1版上运行的Spring Roo版本1.3.2 – Sotades

+0

另外后端数据库是windows-x64上的postgresql版本9.6.0-rc1。 – Sotades

回答

1

在persist之前尝试设置offer.course:在JPA句柄中,双向关系应该由应用程序完成,而不是由库实现。见this page [Getter和Setter节])

由于工作的关系是双向的,以便关系的应用程序更新一侧,另一侧也应得到更新,并且在同步。 在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()); 
} 

祝你好运!