2011-10-19 18 views
1

すべて、JPA:継承テーブルに継承が挿入されない

このアプリケーションではJPA、マッピングエンティティでは注釈を使用しています。 UserStoryというエンティティと、Revisionというエンティティがあります。 UserStoryを改訂するためのOneToManyがあります。

@Entity 
@Table(name = "user_story") 
@NamedNativeQueries({ 
    @NamedNativeQuery(name = "storyBacklog", query = "SELECT userstory.rank AS rank, userstory.description AS description, userstory.estimate AS estimate, userstory.name AS name, " 
     + "userstory.id AS id, userstory.status AS status FROM user_story userstory ORDER BY userstory.rank ASC", resultClass = UserStory.class), 
    @NamedNativeQuery(name = "getCos", query = "SELECT conditions.cos As cos FROM story_cos conditions WHERE conditions.story_id=?1", resultSetMapping = "cosMapping") }) 
@SqlResultSetMappings({ @SqlResultSetMapping(name = "cosMapping", columns = @ColumnResult(name = "cos")) }) 
public class UserStory implements Serializable { 

    private static final long serialVersionUID = 248298400283358441L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    ... 
    @OneToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "story_revisions", joinColumns = @JoinColumn(name = "story_id"), inverseJoinColumns = @JoinColumn(name = "revision_id")) 
    private Set<Revision> revisions; 

ここリビジョンエンティティです:

@Entity 
@Table(name = "revision") 
public class Revision implements Serializable { 

    private static final long serialVersionUID = -1823230375873326645L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(nullable = false) 
    private String description; 

    @Column(name = "date_created", nullable = false) 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date creationDate; 

私はuserStoryを作成すると、私は、それまでに改訂を追加

が、結合テーブルには、私が最初に話を持続していない限り、 その後改訂を追加し、それをマージ人口ではありません。

ここUserStoryを保存するためのコードです:StoryDaoで

public UserStory saveUserStory(UserStory userStory) { 
    Revision revision = new Revision(); 
    revision.setCreationDate(new Timestamp(System.currentTimeMillis())); 
    revision.setDescription("User story created"); 
    Set<Revision> revisions = new HashSet<Revision>(); 
    revisions.add(revision); 
    userStory.setRevisions(revisions); 
    return storyDao.create(userStory); 
    } 

私は存続メソッドを呼び出します。

@Transactional(readOnly = false) 
    public UserStory create(UserStory userStory) { 
    if (userStory.getRank() == null) { 
     Integer highestRank = 0; 
     highestRank = (Integer) entityManager.createNativeQuery("select max(rank) from user_story") 
      .getSingleResult(); 
     if (highestRank != null) 
     highestRank += 1; 
     else 
     highestRank = new Integer(1); 
     userStory.setRank(highestRank); 
    } 
    entityManager.persist(userStory); 
    LOGGER.debug("Added User Story with id " + userStory.getId()); 
    entityManager.detach(userStory); 
    return userStory; 
    } 

ここで私ができるLOGS

Hibernate: 
    insert 
    into 
     user_story 
     (description, estimate, name, rank, status) 
    values 
     (?, ?, ?, ?, ?) 
Hibernate: 
    insert 
    into 
     revision 
     (date_created, description) 
    values 
     (?, ?) 
Hibernate: 
    select 
     revision0_.id as id5_0_, 
     revision0_.date_created as date2_5_0_, 
     revision0_.description as descript3_5_0_ 
    from 
     revision revision0_ 
    where 
     revision0_.id=? 
Hibernate: 
    select 
     userstory0_.id as id3_1_, 
     userstory0_.description as descript2_3_1_, 
     userstory0_.estimate as estimate3_1_, 
     userstory0_.name as name3_1_, 
     userstory0_.rank as rank3_1_, 
     userstory0_.status as status3_1_, 
     revisions1_.story_id as story1_3_3_, 
     revision2_.id as revision2_3_, 
     revision2_.id as id5_0_, 
     revision2_.date_created as date2_5_0_, 
     revision2_.description as descript3_5_0_ 
    from 
     user_story userstory0_ 
    left outer join 
     story_revisions revisions1_ 
      on userstory0_.id=revisions1_.story_id 
    left outer join 
     revision revision2_ 
      on revisions1_.revision_id=revision2_.id 
    where 
     userstory0_.id=? 

からSQLだがここから見るとユーザーのストーリーとリビジョンは保存されますが、 henは、結合テーブルへの挿入を実行する前に、関係が存在するかどうかを調べるために結合を実行しようとします。私はこのオブジェクトを作成しているので、もちろん見つからないでしょう。

この場合、どのようにしてジョインテーブルが作成されますか?

答えて

0

現在作業中です。更新されたコードは次のとおりです

revisions.add(revision); 
userStory = storyDao.create(userStory); 
userStory.setRevisions(revisions); 
return storyDao.update(userStory); 

これがなぜ必要なのかまだわかりません。私はオブジェクトを保持し、それを更新する2つのステップのメソッドです。