使用@OneToMany或@ManyToMany在hibernate中定位未映射的类Exception

时间:2016-04-21 06:53:35

标签: java hibernate

请原谅我,因为我是新手休眠,其他类似问题的答案并没有解决这个问题(我相信我的问题很基本)。我想在我的持久化类中使用OneToMany和ManyToOne映射。 我有以下表格:

<button onclick="window.con = true; change();">click me</button>
<script>
    window.con = false;
    function change() {
        while (window.con == true) {
            var x = event.clientX;
            var y = event.clientY;

            // Put some logic here to break the loop.
        }
       //do some more magical stuff
     }
</script>

我写的以下持久化类: 对于城市:

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)
)

对于PinCode:

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

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

对于区域:

@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

}

3 个答案:

答案 0 :(得分:3)

您必须在“区域”实体的多对一注释中定义连接列:

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

另外,在你的Pincode实体中,你应该在mappedBy属性中指出正确的字段:

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

答案 1 :(得分:1)

问题是您使用mappedBy错误:您在数据库中添加了列名称,但它必须是Area实体中的PinCode实体的属性名称:

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

mappedBy的JavaDoc告诉你同样的事情:

  

拥有该关系的字段。除非关系是单向的,否则是必需的。

答案 2 :(得分:1)

我想你的hibernate配置中有这样的东西

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

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

.addAnnotatedClass(PinCode.class);

确保将所有@Entity类声明为映射类,或将其配置为自动扫描