在Google应用引擎中使用jpa持续保持一对多的关系

时间:2015-07-27 03:46:12

标签: google-app-engine spring-mvc jpa

我有两个实体如下,当我尝试坚持“类别”时,“提示”对象列表不会被持久化。我注意到在我的DAO类中我能够看到带有tipsForCategory类别对象的类别对象1但是当我在坚持后尝试检索时,我只能看到类别详细信息,而tipsForCategory则显示为空列表。

@Entity
public class Category {
    @GeneratedValue
    @Id
    public Long id;

    @Column
    public String categoryName;

    @OneToMany(mappedBy = "category",cascade = {CascadeType.ALL})
    public List<Tip> tipsForCategory;


    public Long getId() { return id; }
    public String getCategoryName() {
        return categoryName;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName.toLowerCase();
    }

    public void addTip(Tip tip) {
        if(!tipsForCategory.contains(tip)) {
            tipsForCategory.add(tip);
        }
    }

    public List<Tip> getTipsForCategory() {

        return tipsForCategory;
    }



}

提示实体代码

@Entity
public class Tip {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Key key;

    @Column
    public String tipDescription;

    @ManyToOne(cascade = {CascadeType.ALL})
    public Category category;


    public String getTipDescription() {
        return tipDescription;
    }

    public void setTipDescription(String tipInformation) {
        this.tipDescription = tipInformation;
    }



}

持久存在我的DAO的代码

 @Override
    @Transactional
    public void save(Category category) {
         EntityManager localEntityManager=entityManager.getEntityManagerFactory().createEntityManager();
         EntityTransaction transaction=localEntityManager.getTransaction();
        try {
            transaction.begin();
            localEntityManager.persist(category);
            localEntityManager.flush();
            transaction.commit();

        }catch (Exception e) {
            e.printStackTrace();
            localEntityManager.close();
        }


    }

我的检索方法是

@Override
    public CategoryDTO findCategory(Long categoryId) throws FixitException{

        CategoryDTO categoryDTO=null;
        Category category=categoryDAO.findById(categoryId);
        if(category!=null) {
            categoryDTO=new CategoryDTO(category);
        }
        return categoryDTO;


    }

 @Override
    public List<TipDTO> retrieveTips(Long categoryId) throws FixitException{

       List<TipDTO> tips=null;
        try {
            CategoryDTO category = findCategory(categoryId);
            if (category != null) {
                tips = category.getTipsForCategory();
            }
        }
        catch(Exception e)
        {
           throw new FixitException(FixitConstants.TIP_RETRIEVAL_ERROR+categoryId,e.getCause());
        }

        return tips;

    }

1 个答案:

答案 0 :(得分:0)

看起来问题是懒惰的提取我只是解决了同样的问题。在我的categoryDAO.findById(..)代码中,我不得不添加一行来检索提示,如下所示

@Override
    public Category findById(Long categoryId) {

        Category category=null;
        try {
            TypedQuery<Category> findByCategoryId = entityManager.createQuery("Select cat from Category  cat where cat.id=:categoryId",Category.class);
            category=findByCategoryId.setParameter("categoryId", categoryId).getSingleResult();

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        *** int tipsSize=category.getTipsForCategory().size();***
        return category;

    }