继续上面的东西,修改下数据库脚本,把共享主键中的Profile的外键关系单独出来唯一列。
数据库脚本(附件)
//User.java
package com.zyp.examples; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; /** * User entity. @author MyEclipse Persistence Tools */ @Entity @Table(name="user") public class User implements java.io.Serializable { // Fields private static final long serialVersionUID = 8415887974331463494L; @Id @GeneratedValue(generator="incrementGenerator", strategy=GenerationType.IDENTITY) @GenericGenerator(name="incrementGenerator", strategy="increment") @Column(name="id") private Integer id; @Column(name="name") private String name; @Column(name="password") private String password; @OneToOne(targetEntity=Profile.class, fetch=FetchType.EAGER, cascade={CascadeType.ALL}, mappedBy="user") private Profile profile; // Constructors /** default constructor */ public User() { } /** full constructor */ public User(String name, String password) { this.name = name; this.password = password; } // Property accessors public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String getPassword() { return this.password; } public void setPassword(String password) { this.password = password; } public Profile getProfile() { return profile; } public void setProfile(Profile profile) { this.profile = profile; } }
//Profile.java
package com.zyp.examples; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; /** * Profile entity. @author MyEclipse Persistence Tools */ @Entity @Table(name="profile") public class Profile implements java.io.Serializable { // Fields private static final long serialVersionUID = -804808825096862895L; @Id @GeneratedValue(generator="incrementGenerator", strategy=GenerationType.IDENTITY) @GenericGenerator(name="incrementGenerator", strategy="increment") @Column(name="id") private Integer id; @Column(name="email") private String email; @Column(name="address") private String address; @OneToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER) @JoinColumn(name="pid", referencedColumnName="id", unique=true) private User user; // Constructors /** default constructor */ public Profile() { } /** minimal constructor */ public Profile(String email, String address) { this.email = email; this.address = address; } // Property accessors public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } public String getEmail() { return this.email; } public void setEmail(String email) { this.email = email; } public String getAddress() { return this.address; } public void setAddress(String address) { this.address = address; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
测试类和之前的基于共享主键的测试类是一样的。
真是没明白mappedBy这个属性的含义,还得好好把那些属性的中文含义搞懂。
大家可以交换两个实体类的mappedBy属性,看看出现的错误