2016-10-25 3 views
0

「Spring Roo in Action」という本のコードに取り組んでいますが、問題が発生しています。この本のとおり、私は2つのJPAエンティティ、OfferingとCourseを生成しています。提供するまでの道のりは、1対多の依存関係です。 Rooのコマンドシェルを使用Spring-Roo JPAがエンティティを更新しないようにしました

は、私は、このように2つのエンティティ間の関係を生成した:

@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; 

}

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

統合テストを実行すると、失敗します。コースは維持されているようですが、提供はされていません。 1つのオファーを持続して、データベースから取得し、どれもが返されませんされている必要があります。

@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

永続化する前に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()); 
} 

幸運を!

関連する問題