2016-04-21 182 views
1

原諒我,因爲我是菜鳥進入休眠狀態,其他類似問題的答案沒有完全解決這個問題(我相信我的問題很基本)。我正在嘗試在持久性類中使用OneToMany和ManyToOne映射。 我有以下表格:使用@OneToMany或@ManyToMany針對未映射的類在休眠中發生異常

city (
    id INT AUTO_INCREMENT, 
    name VARCHAR(255), 
) 

pincode (
    id INT AUTO_INCREMENT, 
    pincode VARCHAR(6), 
    city_id INT FOREIGN KEY fk_city_id ON city(id) 
) 

area (
    id INT AUTO_INCREMENT, 
    name VARCHAR(255), 
    pincode_id INT FOREIGN KEY fk_pincode_id ON pincode(id) 
) 

下持續I類寫道: 城市:

@Table(name="city") 
@Entity 
City { 
    @Id 
    private Integer id; 

    @Column(name="name") 
    private String name; 
} 

對於PIN碼:

@Table(name="pincode") 
@Entity 
PinCode { 
    @Id 
    private Integer id; 

    @Column(name = "pincode") 
    private String pinCode; 

    @ManyToOne 
    @JoinColumn(name = "city_id") 
    private City city; //Multiple pincodes may be mapped to one city 

    //One pincode may have multiple areas 
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "pincode_mapping") 
    @Fetch(value = FetchMode.SELECT) 
    private List<Area> area; 
} 

適用面積:

@Entity 
Area { 
    @Id 
    private Integer id; 

    @Column(name = "name") 
    private String name; 

    @ManyToOne(fetch = FetchType.EAGER, targetEntity = PinCode.class) 
    @Column(name = "pincode_id") 
    private PinCode pinCode; //Multiple areas may be mapped to one pincode 

} 

面對以下異常:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with 
name 'sessionFactory' defined in class path resource [applicationContext-resources.xml]: Invocation of init method failed; 
nested exception is org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.mycompany.model.PinCode.area[com.mycompany.model.Area] 

回答

3

您必須定義您的連接列在您的區域實體多對一註釋:

@ManyToOne(fetch = FetchType.EAGER, targetEntity = PinCode.class) 
@JoinColumn(name = "pincode_id", nullable = false) 

加,在你的郵遞區號的實體,您應當註明在mappedBy屬性的正確字段:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "pincode") 
+0

謝謝。這解決了這個問題。 –

1

的問題是,你使用mappedBy錯誤:您添加有在數據庫中的列名但它必須是由PinCodeArea實體的屬性名稱映射:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "pinCode") 
@Fetch(value = FetchMode.SELECT) 
private List<Area> area; 

mappedBy的JavaDoc告訴你的一樣:

字段擁有該關係。除非關係是單向的,否則是必需的。

1

我想你有這樣的事情在你的Hibernate配置

<mapping class="com.mycompany.model.PinCode" /> 

或者,如果您使用的是Java配置

.addAnnotatedClass(PinCode.class); 

確保taht所有@Entity類被聲明爲映射類或將其配置爲自動掃描

+0

感謝。除註釋錯誤外,這也是缺失的。 –