主键能否@onetoone
现在该继续有关Hibernate的文章了。 最后一个致力于单向@OneToOne关联 。 因此,今天我将向您展示如何获取双向@OneTonOne主键关联 。 本教程中基于前一篇文章的示例。 让我们开始吧。
我将使用以前创建的相同表。 为了建立双向一对一关联,我需要更新两个POJO和保存过程的方式。 让我们考虑一个新版本的Author类:
import javax.persistence.*;@Entity
@Table(name='authors')
public class Author {@Id@GeneratedValueprivate Integer id;private String name;@OneToOne(mappedBy='author', cascade=CascadeType.ALL)private Biography biography;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Biography getBiography() {return biography;}public void setBiography(Biography biography) {this.biography = biography;}}
变化很小。 我刚刚从传记字段中删除了@PrimaryKeyJoinColumn。 在双向关联中,出现关联的两个方面- 拥有和反向 。 对于一对一的双向关系,拥有方对应于包含相应外键的方。 在我们的情况下,拥有方是Author类。 让我们继续。
引用JPA 2规范:
双向关系的反面必须通过使用OneToOne,OneToMany或ManyToMany批注的mappingBy元素来引用其拥有的一面。 mapledBy元素指定实体中作为关系所有者的属性或字段。
本示例的反面是Biography类。 与Author类相比,它需要进行更多必要的更改。
import javax.persistence.*;import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;@Entity
@Table(name='biographies')
public class Biography {@Id@Column(name='author_id')@GeneratedValue(generator='gen')@GenericGenerator(name='gen', strategy='foreign', parameters=@Parameter(name='property', value='author'))private Integer authorId;private String information;@OneToOne@PrimaryKeyJoinColumnprivate Author author;public Author getAuthor() {return author;}public void setAuthor(Author author) {this.author = author;}public Integer getAuthorId() {return authorId;}public void setAuthorId(Integer authorId) {this.authorId = authorId;}public String getInformation() {return information;}public void setInformation(String information) {this.information = information;}
}
第一件重要的事情是authorId字段的修饰和其他注释。
...
@GeneratedValue(generator='gen')
@GenericGenerator(name='gen', strategy='foreign',
parameters=@Parameter(name='property', value='author'))
...
在@GeneratedValue中,我指定生成器的名称(“ gen”),在@GenericGenerator中,我定义生成器的策略。 第二个重要的事情是使用适当的getter和setter添加类中的author 。
...@OneToOne@PrimaryKeyJoinColumnprivate Author author;
...
通过这种方式,我们获得了双向关联。 现在,我们可以从“传记”中访问“作者”,反之亦然,因为两个对象之间都有相互引用。 现在,必须更新对象保存过程:
...public static void main(String[] args) {SessionFactory sessionFactory = HibernateUtil.getSessionFactory();Session session = sessionFactory.openSession();session.beginTransaction();Author author = new Author();author.setName(' O. Henry');Biography biography = new Biography();biography.setInformation('William Sydney Porter better known as O. Henry...');author.setBiography(biography);biography.setAuthor(author);session.save(author);session.getTransaction().commit();session.close();}
...
请注意,现在在添加反面之前,我不再坚持拥有面。 但是您可以看到我将传记设置为作者,并在以下字符串中将作者设置为传记 。 这是双向关联的主要目的。 代码执行的结果是:
Hibernate: insert into authors (name) values (?)
Hibernate: insert into biographies (information, author_id) values (?, ?)
参考: Fruzenshtein的注释博客中来自我们的JCG合作伙伴 Alex Fruzenshtein的双向@OneToOne主键关联 。
翻译自: https://www.javacodegeeks.com/2013/03/bidirectional-onetoone-primary-key-association.html
主键能否@onetoone