Hibernate - 一对一映射不起作用

时间:2015-03-28 12:39:39

标签: java hibernate

我遵循了关于Hibernate中一对一映射的教程,但我总是以persistent class not known异常结束。

基本情况是,我有一个参考客户和汽车的订单。我想将此订单与引用的实体一起保存到数据库中。

Order.java:

public class Order implements Serializable {
    private static final long serialVersionUID = 234543634;

    private String id;
    private Car car;
    private Customer customer;
    private Date date;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    public Customer getCustomer() {
        return customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

order.hbm.xml:

<hibernate-mapping>
    <class name="wa2.entities.Order" table="ORDER">
        <id column="ID" name="id" type="java.lang.String" />
        <property column="DATE" name="date" type="java.util.Date" />
        <one-to-one name="car" class="wa2.entities.Car"
            cascade="save-update"></one-to-one>
        <one-to-one name="customer" class="wa2.entities.Customer"
            cascade="save-update"></one-to-one>
    </class>
</hibernate-mapping>

有什么建议我在这里缺少什么?

编辑:car(它是抽象类,但还有两个继承它的类)

public abstract class Car implements Serializable {
    private static final long serialVersionUID = 8513623981763963637L;

    private String name;
    private String id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }

Customer.java:

public class Customer implements Serializable {
    private static final long serialVersionUID = 864235654;

    private String name;
    private String surname;
    private String adress;
    private String id;
    private Company company;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public String getAdress() {
        return adress;
    }

    public void setAdress(String adress) {
        this.adress = adress;
    }

    public Company getCompany() {
        return company;
    }

    public void setCompany(Company company) {
        this.company = company;
    }

2 个答案:

答案 0 :(得分:0)

持久化类未知意味着hibernate映射不知道您尝试持久化的类。

您应该检查配置(在您的情况下为xml映射)并确保映射每个类。

<one-to-one>映射中引用该类是不够的。您还应将其映射为实体。

答案 1 :(得分:0)

请使用注释,这样会更容易。 如果不是,则需要列出xml中的所有类。 你需要为汽车确定继承策略。

注释要简单得多: 你需要@Entity在你的课程之上(除了Car,见下文)。 你需要id字段上的@Id。

对于继承,您有两个选择。

你可以将Car注释为@MappedSuperclass,这意味着它不是由JPA管理的,但它的字段将在继承的类中。

或者,更适合您的情况,让Car使用@Entity进行分配并定义继承策略: @遗产 @DiscriminatorColumn(...)