定义与Hibernate的关联时出错

时间:2013-04-26 15:29:30

标签: hibernate jpa join entity

我正在尝试使用Hibernate在PostgreSQL数据库中创建两个关联表。我写的实体是:

@Entity
@Table(name="EMPLOYEE")
public class Employee implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="employee_id")
private Long employeeId;
.
.
.

@ManyToOne
@JoinColumn(name="department_id")
public Department getDepartment() {
    return department;
}

public void setDepartment(Department department) {
    this.department = department;
}

private Department department;

@Entity
@Table(name="DEPARTMENT")
public class Department implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="DEPARTMENT_ID")
private Long departmentId;

.
.
.
@OneToMany(mappedBy="department")
public Set<Employee> getEmployees() {
    return employees;
}

public void setEmployees(Set<Employee> employees) {
    this.employees = employees;
}


private Set<Employee> employees;

我的第一个问题是,如果我在成员变量或方法上设置@ManyToOne@OneTOMany注释,那么差异是什么。我几乎是因为它影响了实体,但不记得如何。 我问这个问题,因为它会因错误产生两个不同的消息。如果我按上述方式设置注释,则错误为:

“org.hibernate.MappingException:无法确定类型:java.util.Set,在表:DEPARTMENT,对于列:[org.hibernate.mapping.Column(employees)]”

如果我在成员变量而不是方法上设置注释,那么出现的错误是:

“关系部门不存在”。

如果我将@OneToMany注释更改为@OneToMany(mappedBy="DEPARTMENT"),则错误为:

“org.hibernate.AnnotationException:mappedBy引用未知的目标实体属性:com.al.hibernatetest.Employee.DEPARTMENT”。

有什么问题,它不能像注释所描述的那样创建表格?应该改变什么?

更新:

出现的错误是(它包含一些德语含义:“关系部门不存在”):

ERROR: FEHLER: Relation »department« existiert nicht
  Position: 13
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute statement
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:122)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:136)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2967)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3478)
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:203)
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:183)
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:167)
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:321)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:286)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:205)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:190)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:91)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:764)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:756)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:752)
    at com.al.hibernatetest.Main.main(Main.java:21)
Caused by: org.postgresql.util.PSQLException: FEHLER: Relation »department« existiert nicht
  Position: 13
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1886)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:555)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:417)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:363)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133)
    ... 22 more

1 个答案:

答案 0 :(得分:1)

您需要声明成员变量中的所有注释或方法中的所有注释,任何应该都可以。在示例中,您给了混合两者,这就是“无法确定类型:java.util.Set”的原因。您可以混合它们,但如果需要,可以使用@Access(AccessType.FIELD / PROPERTY)。

在您的示例中,@ OneToMany需要“mappedBy”属性,因为在另一个实体中存在相反的@ManyToOne。 mappedBy获取在另一个实体中使用@ManyToOne注释的字段(或属性)的名称,它不采用数据库中列的名称。这就是错误“mappedBy引用一个未知的目标实体属性:com.al.hibernatetest.Employee.DEPARTMENT”的原因,异常意味着mappedBy是用大写写的,但是该属性的java类中的实际名称似乎小写。

关于错误“关系部门不存在”我不知道实体将如何生成它。