私はHibernateを使用しており、「User」という永続クラスがあります。これはキーワードなので、@ Entity属性を別の名前でマークしました(たとえば、この質問を見ました: postgresql hibernateで「user」という名前のテーブルを使用できません )
ただし、このクラスが別のクラスを拡張しているため、まだ問題が発生しています。hibernateはまだ列名として「user」を使用しようとしていて、混乱しているようです。
@Entity( name = "XonamiUser" )
public class User extends PropertyContainer {
...
そして
@MappedSuperclass
public abstract class PropertyContainer implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected long key;
/** tags */
@ElementCollection
protected Set<String> tags;
@ElementCollection
protected Set<String> searchList;
...
PropertyContainerを拡張する他のクラスは正常に機能しているようです。
これはHibernateのバグですか?このリファクタリングの不足を回避する方法はありますか?ありがとう!
これが私が見ているエラーです(少しクリーンアップされています):
WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 42601
ERROR org.hibernate.util.JDBCExceptionReporter - Batch entry 0 insert into user_search_list (user, search_list) values ('1', 'bjorn') was aborted. Call getNextException to see the cause.
WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 42601
ERROR org.hibernate.util.JDBCExceptionReporter - ERROR: syntax error at or near "user"
Position: 31
最終的に、クラスユーザーをXonamiUserにリファクタリングしました。これは私が望んでいたことではありませんでしたが、うまくいきました。
user
は 予約済みキーワード PostgreSQLでは。 引用符で囲まれた識別子 としてのみ許可されます。
このINSERTコマンドでは、Hibernateに引用符で囲まれた"user"
を使用するように強制する必要があります。
私はHibernateの専門家ではありませんが、おそらくこれ HibernateがユーザーモデルをPostgresに保存する は役に立ちますか?
Userという名前の列またはテーブルを参照しているので少し混乱しています... @ Table -アノテーションを使用して、JPAでエンティティのテーブル名を設定できます。
@Entity
@Table(name = "XonamiUser")
public class User extends PropertyContainer {
Hibernateリファレンスマニュアル には、コレクションの要素を保持するために使用されるテーブル名を定義する方法を示す例があります。そして、たまたまUserエンティティを使用してこれを行い、列をuserではなくuser_id
として定義します。
あなたの場合、このマッピングは問題ないはずです:
@ElementCollection
@CollectionTable(name = "user_search_list",
joinColumns = @JoinColumn(name = "user_id"))
@Column(name = "search_list")
protected Set<String> searchList;