2016-04-21 181 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

感谢。除注释错误外,这也是缺失的。 –