我在两个实体之间有一对一的关系(比如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文件中进行这种映射的正确方法是什么?