【问题标题】:PostgreSql does not "recognize" table created by HibernatePostgreSql 不“识别”由 Hibernate 创建的表
【发布时间】: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 中)以实现连接?我已经设置了线

&lt;property name="hibernate.connection.url"&gt;jdbc:postgresql://localhost:5432/testDB&lt;/property&gt; 在 Eclipse 的 cfg.xml 文件中。

【问题讨论】:

  • 最像这样的情况是折叠。未加引号的标识符折叠为小写。许多访问库会为您自动引用,而 psql 之类的则不会。
  • 您能否澄清您的评论并提出您的建议可以做什么?当你表达它时,我无法抓住它。谢谢。
  • 你同时拥有"DEPARTMENT""department",它们的大小写应该相同。
  • @muistooshort:我尝试全部写成小写或大写,但它并没有改变任何东西。不幸的是,这个明显的案例并没有消除问题。
  • @ScottMarlowe 几乎可以肯定是正确的——它是案例折叠。您设计不良的 ORM 是双引号所有标识符,这意味着“DEPARTMENT”不同于“Department”或“department”。如果您的标识符名称中有拼写错误,它也不会给您任何错误。如果您不相信他/我,请在 PostgreSQL 中打开语句登录。然后,恐怕你有很多乏味的代码搜索/替换来追踪和检查你所有的标识符问题。

标签: hibernate postgresql join


【解决方案1】:

启动 psql your_database 并发出 \d 以查看表格。

我对 Hibernate 不熟悉,但很有可能像 @Table(name="DEPARTMENT") 这样的语句正在创建实际上称为 "DEPARTMENT" 的表,而您的查询实际上是从 DEPARTMENT(不带双引号)查询的,而 postgresql将解释为department

如果是这样,解决方法是在创建表名时使用小写字母,或者让 Hibernate 在查询表时使用双引号和大写字母。

【讨论】:

    【解决方案2】:

    如果您也有连接问题,解决这些问题的过程就是您所期望的。

    1. 检查 postgreSQL 服务器是否正在运行
    2. 检查您是否可以通过 psql/pgAdmin 进行连接
    3. 检查您的应用程序中的连接设置是否与您在第 2 步中使用的相同
    4. 检查连接调用的返回码
    5. 在 PostgreSQL 中打开连接日志,看看是否得到 (a) 尝试和 (b) 错误
    6. 简化代码以找出错误所在。

    #1 或 #3 的原因出乎意料的多,可能您没有执行 #4,或者您不会费心询问其他错误。

    【讨论】:

      猜你喜欢
      • 2017-10-24
      • 2017-11-15
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      相关资源
      最近更新 更多