我有一个使用 hibernate 映射到 postgres 数据库的模型类。我的模型类是:
@Entity
@Table(name="USER")
public class User {
@Id
@GeneratedValue
@Column(name="id")
private long id;
@Column(name="username", unique=true)
private String username;
@Column(name="email")
private String email;
@Column(name="created")
private Timestamp created;
public User(long id, String username, String email) {
this.id = id;
this.username = username;
this.email = email;
}
}
我尝试使用以下查询检索用户名“adam”的用户:
tx = session.beginTransaction();
TypedQuery<User> query = session.createQuery("FROM User u WHERE u.username = :username", User.class).setParameter("username", "adam");
user = query.getSingleResult();
我收到一个例外:
org.postgresql.util.PSQLException: ERROR: column user0_.id does not exist
我的 bash shell 数据库如下所示:
hibernate如何将类属性映射到表列?是否匹配基于@Column(name="username")
仅或者它还尝试根据数据类型和约束(例如唯一/自动增量)进行匹配?
Solution
In PostgreSQL您必须像这样指定模式名称:
@Table(name="table_name", schema = "myapp")
^^^^^^^^^^^^^^^^
很长的故事
你得到这个错误:
org.postgresql.util.PSQLException: ERROR: column user0_.id does not exist
因为当你创建数据库时PostgreSQL,它创建一个名为的默认模式public,所以当你没有在中指定名称时Entity
然后 Hibernate 会自动检查public schema.
良好做法
- 名称中请勿使用大写字母
database
, schema
, tables
or columns
in PostgreSQL。否则,您应该用引号转义此名称,这可能会导致语法错误,因此您可以使用:
@Table(name="table_name", schema = "schema_name")
^^^^^^^^^^ ^^^^^^^^^^^
- 关键字USER是保留关键字PostgreSQL 看一眼 https://www.postgresql.org/docs/8.1/static/sql-keywords-appendix.html
+----------+-----------+----------+-----------+---------+
| Key Word |PostgreSQL |SQL:2003 | SQL:1999 | SQL-92 |
+----------+-----------+----------+-----------+---------+
| .... .... .... .... .... |
+----------+-----------+----------+-----------+---------+
| USER | reserved |reserved | reserved | reserved|
+----------+-----------+----------+-----------+---------+
- 之间的差异Dto and Entity例如,在实体名称末尾使用 Entity 是一种很好的做法
UserEntity
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)