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)
你能幫我理解爲什麼並解決這兩個問題嗎?
這是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
這是因爲你有' @ Table'在'PersonneDo'類中。所以當你擴展這個類時,它會在這兩個類中得到兩個註釋。 –