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 シェルからのデータベースは次のようになります:
Hibernate はクラス属性をテーブル列にどのようにマップしますか? のみに基づいて一致します@Column(name="username")
か、それともデータ型や一意/自動増分などの制約に基づいて一致を試みますか?
ベストアンサー1
解決
でPostgreSQLスキーマの名前を次のように指定する必要があります:
@Table(name="table_name", schema = "myapp")
^^^^^^^^^^^^^^^^
長い話
このエラーが発生しました:
org.postgresql.util.PSQLException: ERROR: column user0_.id does not exist
なぜなら、データベースを作成するとPostgreSQL、デフォルトのスキーマを作成します。公共、で名前を指定しない場合は、Entity
Hibernateは自動的にチェックします。公共スキーマ。
良い習慣
database
、、またはの名前に大文字を使用しないでくださいschema
。tables
columns
PostgreSQLそれ以外の場合は、この名前を引用符でエスケープする必要がありますが、これにより構文エラーが発生する可能性があります。代わりに、次のように使用できます。
@Table(name="table_name", schema = "schema_name")
^^^^^^^^^^ ^^^^^^^^^^^
- キーワードユーザーは予約語ですPostgreSQL を見てみましょう
+----------+-----------+----------+-----------+---------+
| Key Word |PostgreSQL |SQL:2003 | SQL:1999 | SQL-92 |
+----------+-----------+----------+-----------+---------+
| .... .... .... .... .... |
+----------+-----------+----------+-----------+---------+
| USER | reserved |reserved | reserved | reserved|
+----------+-----------+----------+-----------+---------+
- の違いまでそして実在物エンティティ名の最後にEntityを使用することをお勧めします。例:
UserEntity