OneToOne主键关联

首先来看表的关系:

表1:

Husband

husband_id<<pk>>

name


表2

Wife

wife_id <<pk>><<fk>>
name



Husband类

@Entity
public class Husband {
	@Id
	@GeneratedValue
	private int id;
	private String name;
	@OneToOne(cascade = CascadeType.ALL)
	@PrimaryKeyJoinColumn
	private Wife wife;

	public int getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

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

	public Wife getWife() {
		return wife;
	}

	public void setWife(Wife wife) {
		this.wife = wife;
	}

}

 

Wife类

@Entity
public class Wife {
	@Id
	@GeneratedValue(generator = "myForeignGenerator")
	@org.hibernate.annotations.GenericGenerator(name = "myForeignGenerator", strategy = "foreign", parameters = @Parameter(name = "property", value = "husband"))
	private int id;
	private String name;
	@OneToOne(optional = false, cascade = CascadeType.ALL)
	@PrimaryKeyJoinColumn
	private Husband husband;

	public int getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

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

	public Husband getHusband() {
		return husband;
	}

	public void setHusband(Husband husband) {
		this.husband = husband;
	}
}

 

wife类中的

@Id
 @GeneratedValue(generator = "myForeignGenerator")
 @org.hibernate.annotations.GenericGenerator(name = "myForeignGenerator", strategy = "foreign", parameters = @Parameter(name = "property", value = "husband"))
 private int id;

 

定义了外键的生成策略,这样可以在级联插入时保持husband的主键和wife的外键(也是主键)相同。

 

@Test
	public void testOneToOnePK() {
		OneToOne.PK.Husband husband = new OneToOne.PK.Husband();
		OneToOne.PK.Wife wife = new OneToOne.PK.Wife();
		husband.setName("me");
		wife.setName("mywife");

		wife.setHusband(husband);
		session.beginTransaction();
		session.save(wife);//级联插入husband
		// session.save(husband);
		session.getTransaction().commit();
	}

 

 

你可能感兴趣的:(Hibernate)