swd*_*don 21 java postgresql entity hibernate jpa
我有一个使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下查询检索用户名为"adam"的用户:
tx = session.beginTransaction();
TypedQuery<User> query = session.createQuery("FROM User u WHERE u.username = :username", User.class).setParameter("username", "adam");
user = query.getSingleResult();
Run Code Online (Sandbox Code Playgroud)
我得到一个例外,说:
org.postgresql.util.PSQLException: ERROR: column user0_.id does not exist
Run Code Online (Sandbox Code Playgroud)
我的bash shell数据库如下所示:
hibernate如何将类属性映射到表列?它是基于@Column(name="username")唯一匹配还是根据数据类型和约束(例如唯一/自动增量)尝试匹配?
YCF*_*F_L 33
它给你这个错误:
@Table(name="table_name", schema = "myapp")
^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
因为当您创建数据库PostgreSQL时,它会创建一个名为的默认模式Entity,因此当您未在其中指定名称时database,它将在公共模式中自动检查,因为您会收到此错误.
另一件事确认架构名称是正确的,错误说:
org.postgresql.util.PSQLException: ERROR: column user0_.id does not exist
Run Code Online (Sandbox Code Playgroud)
并不是 :
@Table(name="table_name", schema = "schame_name")
^^^^^^^^^^ ^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
确认查询使用schema而不是真实tables
要解决此问题,您必须指定模式的名称,如下所示:
+----------+-----------+----------+-----------+---------+
| Key Word |PostgreSQL |SQL:2003 | SQL:1999 | SQL-92 |
+----------+-----------+----------+-----------+---------+
| .... .... .... .... .... |
+----------+-----------+----------+-----------+---------+
| USER | reserved |reserved | reserved | reserved|
+----------+-----------+----------+-----------+---------+
Run Code Online (Sandbox Code Playgroud)
不要在PostgreSQL中的表或列的名称中使用大写字母.
@Table(name="table_name", schema = "myapp")
^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
和用户名被保留在PostgreSQL的关键字TA一看
对于遇到此异常的人,在 postgres 中,每当您编写实体类时,请尝试将其与正确的架构(表所在的位置)关联起来,如下所示:
@Entity
@Table(name = "user", schema = "users_details")
public class User implements Serializable{
@Column(name = "id")
Long id; //long is not recommended
// Other data
}
Run Code Online (Sandbox Code Playgroud)
正如 @YCF_L 所说,不要在表名或列名中使用大写字母,否则您将得到此异常。
当您必须从实体类自动生成表或反之亦然的情况下,此约定变得更加重要。
小智 5
应在实体类上添加架构名称。对于此示例,当架构名称是公共的时
@Table(name = "user", schema = "public")
Run Code Online (Sandbox Code Playgroud)
请参阅下面的 PostgreSQL 管理视图
有关 SpringBoot Java 和 Postgre SQL 连接的更多信息,请参阅此处: https://cmsoftwaretech.wordpress.com/2020/04/25/springboot-thymleaf-using-postgresql/