2016-10-25 4 views
0

Я работаю над кодом из книги «Spring Roo in Action», и у меня возникает проблема. Согласно книге, я создаю два субъекта JPA: «Предложение и курс»; Конечно, предложение - это зависимость «один ко многим».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

Ах, извините; Spring Roo Release 1.3.2 работает на STS версии 3.8.1. – Sotades

+0

. Также базовая база данных - postgresql версия 9.6.0-rc1 на windows-x64. – Sotades

ответ

1

Попробуйте установить offer.course перед сохранением: в JPA обрабатывать двунаправленные отношения должно быть выполнено приложением, а не реализацией библиотеки. См this page [геттеры и сеттеры раздел])

По мере того как отношения является двунаправленным, так как обновление приложения одна сторона отношений, с другой стороны также должны обновляться и быть синхронизированы. В 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()); 
} 

Удачи!

Смежные вопросы