クラスをデータベースのテーブルにマッピングしていますが、テストを実行すると、次のエラーが表示されます。
Caused by: org.hibernate.AnnotationException: A Foreign key refering com.modulos.pvs.acceso.datos.entity.Provincia from com.modulos.pvs.acceso.datos.entity.Ciudad has the wrong number of column. should be 2
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.Java:429)
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.Java:115)
at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.Java:1550)
at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.Java:1473)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.Java:1389)
at org.hibernate.cfg.Configuration.buildMappings(Configuration.Java:1345)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.Java:717)
at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.Java:211)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.Java:1541)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1479)
... 40 more
これらは私のクラスです:
// PROVINCIA TABLE
@Entity
@Table(name="provincia")
@NamedQuery(name = "Provincia.findAll", query = "SELECT p FROM Provincia p")
public class Provincia implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private ProvinciaPK id;
private String nombreProvincia;
// bi-directional many-to-one association to Region
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "codRegion")
private Region region;
//bi-directional many-to-one association to Ciudad
@OneToMany(mappedBy="provincia", fetch=FetchType.LAZY)
private List<Ciudad> ciudad;
//GETTER AND SETTER
//TABLE CIUDAD
/**
* The persistent class for the city database table.
*
*/
@Entity
@Table(name="ciudad")
@NamedQuery(name = "Ciudad.findAll", query = "SELECT c FROM Ciudad c")
public class Ciudad implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private CiudadPK id;
private String nombreCiudad;
// bi-directional many-to-one association to Provincia
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "codProvincia", insertable = false, updatable = false)
private Provincia provincia;
//bi-directional many-to-one association to Direcciones
@OneToMany(mappedBy="ciudad", fetch=FetchType.LAZY)
private List<Direcciones> direcciones;
// GETTER AND SETTER
どちらも主キーがクラスに埋め込まれています。
//PROVINCIA PK
/**
* The primary key class for the provincia database table.
*
*/
@Embeddable
public class ProvinciaPK implements Serializable {
//default serial version id, required for serializable classes.
private static final long serialVersionUID = 1L;
private String codProvincia;
private String codRegion;
public ProvinciaPK() {
}
/getter and setter
//ciudad pk
/**
* The primary key class for the region database table.
*
*/
@Embeddable
public class CiudadPK implements Serializable {
//default serial version id, required for serializable classes.
private static final long serialVersionUID = 1L;
private String codCiudad;
private String codProvincia;
public CiudadPK() {
}
//GETTER AND SETTER
これは私のリレーショナルモデルデータベースです
誰でもアイデアがありますか?それは機能しませんか?
編集30/11/2014-空のアソシエーションのリストに戻るこれは私のJUnitテストです
Region region = new Region();
region.setId(new RegionPK("RM","CHL"));
region.setProvincias(regionDAO.getProvinciaRegion(region));
System.out.println(region.getProvincias());
これは、州の協会を返す方法です
@Transactional(readOnly=true)
@Override
public List<Provincia> getProvinciaRegion(Region region) {
region = getRegionById(region);
Hibernate.initialize(region.getProvincias());
return region.getProvincias();
}
そして、これは私がデータベースに持っています
クラスCiudadPK
には2つの列があります。 1つの列に制限されている@JoinColumn
のみを使用しています。 @JoinColumns
を使用して、FKの両方の列をリストする必要があります。
// bi-directional many-to-one association to Provincia
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "codProvincia", insertable = false, updatable = false),
@JoinColumn(name = "codRegion", insertable = false, updatable = false)
})
private Provincia provincia;
おそらくCiudad
を含む他の問題も発生する可能性があります。こちらのパターンに従って修正してください。