2011-10-19 2 views
1

Tous,JPA: persist n'insère pas dans la table de jointure

J'utilise JPA pour cette application et les annotations pour les entités de mappage. J'ai une entité appelée UserStory et une autre appelée Revision. Il existe un OneToMany pour UserStory à réviser.

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

est ici entité de révision:

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

Lorsque je crée un récit utilisateur; Ajouter une révision à elle,

mais la table de jointure est pas moins peuplée, je persiste histoire d'abord, puis ajouter révision et fusionner.

est ici le code d'enregistrement d'un récit utilisateur:

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

dans StoryDao j'appelle la méthode persisteront:

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

est ici le SQL de JOURNAUX

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=? 

je peux voir à partir de là, il enregistre l'histoire de l'utilisateur et la révision, mais t hen essaie d'exécuter une jointure pour voir si la relation existe avant de faire une insertion dans la table de jointure. Lequel, bien sûr, ne trouvera pas parce que je crée cet objet.

Comment obtient-il la table de jointure remplie dans ce cas?

Répondre

0

Fonctionne maintenant. Voici le code mis à jour

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

Je ne sais toujours pas pourquoi c'est nécessaire; la méthode en deux étapes où je persiste un objet puis le mettre à jour.

Questions connexes