我正在编写“Spring Roo in Action”这本书中的代码,我遇到了一个问题。根据这本书,我生成了两个JPA实体,Offering和Course;course to offering是一对多的依赖关系。
使用Roo命令shell,我已经生成了两个实体之间的关系,如下所示:
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());
}
}有人能告诉我这里哪里做错了吗?
发布于 2016-11-08 00:29:29
在持久化之前尝试设置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());
}祝好运!
https://stackoverflow.com/questions/40235298
复制相似问题