2014-02-26 26 views
0

我有這些實體:Java繼承的FindAll「未映射」

@Entity(name = "PersonneSingleTableDo") 
@Table(name = "personne") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "sexe", discriminatorType = DiscriminatorType.STRING) 
public abstract class PersonneDo { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private int   id; 
    @Column(name = "nom") 
    private String  nom; 
    @Column(name = "datenaissance") 
    private Date   datenaissance; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "personneDo", fetch = FetchType.EAGER) 
    private Set<AmitieDo> amis; 
... 


@Entity(name = "HommeSingleTableDo") 
@DiscriminatorValue(value = "homme") 
public class HommeDo extends PersonneDo { 

} 


@Entity(name = "FemmeSingleTableDo") 
//@Table(name = "personne") 
@DiscriminatorValue(value = "femme") 
public class FemmeDo extends PersonneDo { 

} 


@Entity(name = "AmitieSingleTableDo") 
@Table(name = "amis") 
public class AmitieDo { 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int  id; 

    @ManyToOne 
    @JoinColumn(name = "idPersonne") 
    private PersonneDo personneDo; 
    @ManyToOne 
    @JoinColumn(name = "idAmi") 
    private PersonneDo amiPersonneDo; 
... 

我有兩個DAO的管理我的2個繼承類:

@Repository("femmeSingleTableJpaDao") 
@Transactional(value = "singletable", propagation = Propagation.MANDATORY) 
public class FemmeSingleTableJpaDao implements IFemmeSingleTableDao { 

    @PersistenceContext(unitName = "springmvcapp_pu_singletable") 
    private EntityManager entityManager; 

    /* (non-Javadoc) 
    * @see ili.persistence.dao.IFemmeSingleTableDao#createFemmeDo(ili.persistence.bean.stratsingletable.FemmeDo) 
    */ 
    @Override 
    public void createFemmeDo(FemmeDo femmeDo) { 
    entityManager.persist(femmeDo); 
    } 

    /* (non-Javadoc) 
    * @see ili.persistence.dao.IFemmeSingleTableDao#findFemmeDo(int) 
    */ 
    @Override 
    public FemmeDo findFemmeDo(int idFemmeDo) { 
    final FemmeDo femmeDo = entityManager.find(FemmeDo.class, idFemmeDo); 
    return femmeDo; 
    } 

    /* (non-Javadoc) 
    * @see ili.persistence.dao.IFemmeSingleTableDao#findAllFemmeDo() 
    */ 
    @Override 
    public List<FemmeDo> findAllFemmeDo() { 
    final TypedQuery<FemmeDo> query = entityManager.createQuery("select p from FemmeDo p", 
     FemmeDo.class); 
    return query.getResultList(); 
    } 

    /* (non-Javadoc) 
    * @see ili.persistence.dao.IFemmeSingleTableDao#updateFemmeDo(int, ili.persistence.bean.stratsingletable.FemmeDo) 
    */ 
    @Override 
    public void updateFemmeDo(int idFemmeDo, FemmeDo femmeDo) { 
    femmeDo.setId(idFemmeDo); 
    entityManager.merge(femmeDo); 
    } 

    /* (non-Javadoc) 
    * @see ili.persistence.dao.IFemmeSingleTableDao#deleteFemmeDo(int) 
    */ 
    @Override 
    public void deleteFemmeDo(int idFemmeDo) { 
    entityManager.remove(entityManager.getReference(FemmeDo.class, idFemmeDo)); 
    } 

} 

@Repository("hommeSingleTableJpaDao") 
@Transactional(value = "singletable", propagation = Propagation.MANDATORY) 
public class HommeSingleTableJpaDao implements IHommeSingleTableDao { 

    @PersistenceContext(unitName = "springmvcapp_pu_singletable") 
    private EntityManager entityManager; 

    /* (non-Javadoc) 
    * @see ili.persistence.dao.IPersonneDao#createPersonneDo(ili.persistence.bean.PersonneDo) 
    */ 
    @Override 
    public void createHommeDo(HommeDo hommeDo) { 
    entityManager.persist(hommeDo); 
    } 

    /* (non-Javadoc) 
    * @see ili.persistence.dao.IPersonneDao#findPersonneDo(int) 
    */ 
    @Override 
    public HommeDo findHommeDo(int idHommeDo) { 
    // final TypedQuery<PersonneDo> query = entityManager.createQuery(
    //  "select p from PersonneDo p where p.id = :id", PersonneDo.class); 
    // query.setParameter("id", idPersonneDo); 
    // return query.getSingleResult(); 
    final HommeDo hommeDo = entityManager.find(HommeDo.class, idHommeDo); 
    return hommeDo; 
    } 

    /* (non-Javadoc) 
    * @see ili.persistence.dao.IPersonneDao#findAllPersonneDo() 
    */ 
    @Override 
    public List<HommeDo> findAllHommeDo() { 
    final TypedQuery<HommeDo> query = entityManager.createQuery("select p from HommeDo p", 
     HommeDo.class); 
    return query.getResultList(); 
    } 

    /* (non-Javadoc) 
    * @see ili.persistence.dao.IPersonneDao#updatePersonneDo(int, ili.persistence.bean.PersonneDo) 
    */ 
    @Override 
    public void updateHommeDo(int idPersonneDo, HommeDo personneDo) { 
    personneDo.setId(idPersonneDo); 
    entityManager.merge(personneDo); 
    } 

    /* (non-Javadoc) 
    * @see ili.persistence.dao.IPersonneDao#deletePersonneDo(int) 
    */ 
    @Override 
    public void deleteHommeDo(int idHommeDo) { 
    // final Query query = entityManager.createQuery("delete from PersonneDo p where p.id = :id"); 
    // query.setParameter("id", idPersonneDo); 
    // query.executeUpdate(); 
    entityManager.remove(entityManager.getReference(HommeDo.class, idHommeDo)); 
    } 

} 

我有一個JUnit測試用例來測試所有的方法:堅持,查找和更新工作正常,但我有兩個問題:

首先,findAll方法不工作,無論是道。它輸出這些錯誤:

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: HommeDo is not mapped [select p from HommeDo p] 
and 
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: FemmeDo is not mapped [select p from FemmeDo p] 

其次,當我刪除的人(「男士」),這是朋友(「AMIS」)與另一個和我檢索(再次查找)這第二個人,它仍然列出了第一男人作爲朋友,儘管有級聯詮釋:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "personneDo", fetch = FetchType.EAGER) 

你能幫我理解爲什麼並解決這兩個問題嗎?

回答

0

使用註釋@TableHommeDoFemmeDo

@Table(name = "table_x") 

另外,如果你不使用name = "HommeSingleTableDo"@Entity註釋,然後將其刪除。例如:

@Entity 
+0

這是SINGLE_TABLE的繼承,如果我把表繼承類我得到:févr。 26,2014 6:31:55 PM org.hibernate.cfg.AnnotationBinder bindClass 警告:HHH000139:在SINGLE_TABLE層次結構的子類中非法使用Table:ili.persistence.bean.stratsingletable.HommeDo févr。 26,2014 6:31:55 PM org.hibernate.cfg.AnnotationBinder bindClass 警告:HHH000139:在SINGLE_TABLE層次結構的子類中非法使用Table:ili.persistence.bean.stratsingletable.FemmeDo – user3332598

+0

這是因爲你有' @ Table'在'PersonneDo'類中。所以當你擴展這個類時,它會在這兩個類中得到兩個註釋。 –