我正在尝试使用注释的一对一关系 这是代码。
package test.hibernate;
@Entity
@Table(name="EMPLOYEE")
public class Employee {
@Id
@GeneratedValue
@Column(name="EMP_ID")
private Long empID;
@Column(name="fName")
private String fName;
@Column(name="lName")
private String lName;
@OneToOne(mappedBy="employee", cascade=CascadeType.ALL)
private Address address;
public Employee(/* Long empID, */String fName, String lName) {
super();
// this.empID = empID;
this.fName = fName;
this.lName = lName;
}
public Employee() {
super();
}
public Long getEmpID() {
return empID;
}
public void setEmpID(Long empID) {
this.empID = empID;
}
public String getfName() {
return fName;
}
public void setfName(String fName) {
this.fName = fName;
}
public String getlName() {
return lName;
}
public void setlName(String lName) {
this.lName = lName;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
package test.hibernate;
@NamedNativeQueries({ @NamedNativeQuery(name = "addressQuery", query = "from Address", resultClass = Address.class) })
public class Address {
@Column(name = "EMP_ID")
@GenericGenerator(name = "gen", strategy = "foreign", parameters = @Parameter(name = "property", value = "employee"))
private Long empID;
@Column(name = "ADDRESS")
private String address;
@Column(name = "CITY")
private String city;
@OneToOne
@PrimaryKeyJoinColumn
private Employee employee;
public Address() {
super();
// TODO Auto-generated constructor stub
}
public Address(/* Long empID, */String address, String city) {
super();
// this.empID = empID;
this.address = address;
this.city = city;
}
public Long getEmpID() {
return empID;
}
public void setEmpID(Long empID) {
this.empID = empID;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
}
}
我收到以下异常:
Hibernate one to many (XML Mapping)
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
org.hibernate.AnnotationException: Unknown mappedBy in: test.hibernate.Employee.address, referenced property unknown: test.hibernate.Address.employee
at org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:129)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1127)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:296)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1283)
at test.hibernate.HibernateUtil.openSession(HibernateUtil.java:14)
at test.hibernate.Test.main(Test.java:11)
Exception in thread "main" java.lang.NullPointerException
at test.hibernate.HibernateUtil.openSession(HibernateUtil.java:19)
at test.hibernate.Test.main(Test.java:11)
我的代码出了什么问题?有人可以帮忙吗?
答案 0 :(得分:16)
问题不是mappedBy
本身的价值。问题是Address
类中没有@Entity注释。添加它将解决问题。在Java SE环境类中也应该添加到persistence.xml。
答案 1 :(得分:0)
如果我们没有在hibernate配置文件中指定映射类条目<mapping class="test.hibernate.Address" />
,则会发生同样的异常。
答案 2 :(得分:0)
在 Employee
类中,您已经添加了 @Entity
注释,但是在地址类中您没有添加 @Entity
注释,因此您的问题很清楚,只需将 @Entity
添加到你的班级就是这样:
@Entity
public class Address {
// your code here ....
}
问题在于没有创建 bean,因为 @Entity
注释对此负责,例如 @Service
和/或 @Component
注释。