如何将一对一的jpa映射转换为一对一的hbm.xml映射?

时间:2017-10-04 15:56:51

标签: java hibernate jpa

我在两个实体之间有一对一的关系(比如Book.java和Author.java):

@Table(name = "BOOK")
@SequenceGenerator(name = "seqBook", allocationSize = 0, sequenceName = "SEQ_BOOK")
@Entity
class Book implements Serializable {

@Id
@Column(name = "BOOK_ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqBook")
private Long id;

@Column(name = "BOOK_NAME")
private Long name;

@OneToOne(mappedBy = "book", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
private Author author;

public Long getId() {
    return id;
}

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

public Long getName() {
    return name;
}

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

public Author getAuthor() {
    return author;
}

public void setAuthor(Author author) {
    this.author = author;
}
}

@Entity
@Table(name = "AUTHOR")
@SequenceGenerator(name = "seqAuthor", allocationSize = 0, sequenceName = "SEQ_AUTHOR")
class Author implements Serializable {

@Id
@Column(name = "AUTHOR_ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqAuthor")
private Long id;

@Column(name = "AUTHOR_NAME")
private Long name;

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)
@JoinColumn(name = "BOOK_ID", nullable = false)
private Book book;

public Long getId() {
    return id;
}

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

public Book getBook() {
    return book;
}

public void setBook(Book book) {
    this.book = book;
}

public Long getName() {
    return name;
}

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

正如您所看到的,它们是由JPA注释映射的,并且工作正常。在数据库表中,我只是在AUTHOR表中将BOOK_ID作为外键 现在我想将映射移动到hbm.xml文件,因此我创建了Book.hbm.xml和Author.hbm.xml并从java类中删除了注释:

<hibernate-mapping package="com.abc" default-access="field">
<class
        name="com.abc.book"
        table="BOOK">
    <id name="id" column="BOOK_ID">
        <generator class="native">
            <param name="sequence_name">SEQ_BOOK</param>
        </generator>
    </id>

    <property
            name="name"
            column="BOOK_NAME"/>

    <one-to-one
            name="author"
            class="Author"
            lazy="false"
            fetch="join"
            cascade="all"
            constrained="true"/>

</class>
</hibernate-mapping>

<hibernate-mapping package="com.abc" default-access="field">

<class
    name="com.abc.author"
    table="AUTHOR">
    <id name="id" column="AUTHOR_ID">
        <generator class="native">
            <param name="sequence_name">SEQ_AUTHOR</param>
        </generator>
    </id>

    <property
        name="name"
        column="AUTHOR_NAME"/>

    <one-to-one
        name="book"
        class="Book"
        cascade="all"/>

</class>
</hibernate-mapping>

但是我得到了HibernateObjectRetrievalFailureException,我在xml文件中尝试了一对一标签的不同属性。现在有人在hbm.xml文件中进行这种映射的正确方法是什么?

0 个答案:

没有答案