【发布时间】:2013-06-05 15:44:44
【问题描述】:
我在 PostgreSQL 数据库中创建两个与休眠相关的表时遇到问题。我倾向于认为问题出在数据库(配置?),因为我已经尝试了 Internet 站点中提出的几乎所有 Hibernate 方法,但仍然收到相同的错误。使用 PostgreSql 数据库之前是否需要任何配置?我无法以其他方式解释出现的错误:
“关系部门不存在”
我加入两个实体Employee和Department如下:
@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;
我正在尝试在 main 方法中创建包含几条记录的表:
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
session.beginTransaction();
Department department = new Department();
department.setDepartmentName("Sales");
session.persist(department);
Employee emp1 = new Employee("Nina", "Mayers", "111");
Employee emp2 = new Employee("Tony", "Almeida", "222");
emp1.setDepartment(department);
emp2.setDepartment(department);
session.persist(emp1);
session.persist(emp2);
session.getTransaction().commit();
session.close();
在线出现错误:session.persist(department);
有谁在 PostgreSql 数据库方面有经验,帮助我找出为什么它无法识别表/关系并出现错误:
“关系部门不存在”?
更新:
我查看了日志文件。在 Eclipse 发出通常的消息之后,消息的最后一行是:“无法建立连接,因为目标机器主动拒绝了它”。我推断问题可能出在连接上。是否有任何属性,我应该设置(在 pgAdmin 中)以实现连接?我已经设置了线
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/testDB</property> 在 Eclipse 的 cfg.xml 文件中。
【问题讨论】:
-
最像这样的情况是折叠。未加引号的标识符折叠为小写。许多访问库会为您自动引用,而 psql 之类的则不会。
-
您能否澄清您的评论并提出您的建议可以做什么?当你表达它时,我无法抓住它。谢谢。
-
你同时拥有
"DEPARTMENT"和"department",它们的大小写应该相同。 -
@muistooshort:我尝试全部写成小写或大写,但它并没有改变任何东西。不幸的是,这个明显的案例并没有消除问题。
-
@ScottMarlowe 几乎可以肯定是正确的——它是案例折叠。您设计不良的 ORM 是双引号所有标识符,这意味着“DEPARTMENT”不同于“Department”或“department”。如果您的标识符名称中有拼写错误,它也不会给您任何错误。如果您不相信他/我,请在 PostgreSQL 中打开语句登录。然后,恐怕你有很多乏味的代码搜索/替换来追踪和检查你所有的标识符问题。
标签: hibernate postgresql join