2012-01-27 47 views
5

Tôi đang sử dụng Hibernate và có một lớp liên tục được gọi là "Người dùng". Vì đây là một từ khóa, tôi đã đánh dấu thuộc tính @Entity bằng một tên khác (tôi đã thấy, ví dụ: câu hỏi này: Unable to use table named "user" in postgresql hibernate)LRI: lỗi cú pháp tại hoặc gần "người dùng"

Tuy nhiên, tôi vẫn gặp rắc rối vì lớp này mở rộng khác và có vẻ như ngủ đông vẫn đang cố gắng sử dụng "người sử dụng" như một tên cột và nhận sai lầm:

@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; 
    ... 

lớp khác của tôi mà mở rộng PropertyContainer dường như làm việc tốt.

Đây có phải là lỗi trong chế độ ngủ đông không? Có cách nào xung quanh ngắn này refactoring? Cảm ơn!

Dưới đây là những sai lầm tôi nhìn thấy (hơi dọn dẹp):

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 
+0

@TJ, tôi đã thêm các lỗi khiến tôi tin rằng nó vẫn đang sử dụng tên cột. –

Trả lời

1

Cuối cùng, tôi đã tái cấu trúc người dùng lớp thành XonamiUser. Đây không phải là những gì tôi muốn, nhưng nó hoạt động rất tốt.

1

Tôi là một chút nhầm lẫn được bạn đề cập đến một cột hoặc bảng tên tài khoản ... Bạn có thể sử dụng @Table - chú thích để thiết lập tên bảng cho các thực thể trong JPA:

@Entity 
@Table(name = "XonamiUser") 
public class User extends PropertyContainer { 
+0

Tôi nhận được "Không thành công: tạo bảng user_search_list (người dùng int8 không null, search_list varchar (255)) ... ERROR org.hibernate.tool.hbm2ddl.SchemaUpdate - ERROR: lỗi cú pháp tại hoặc gần" người dùng " –

1

các Hibernate reference manual có dụ cho thấy làm thế nào để xác định tên bảng được sử dụng để tổ chức các yếu tố của bộ sưu tập. Và điều đó xảy ra khi sử dụng thực thể Người dùng để làm như vậy và để xác định cột là user_id thay vì người dùng.

lập bản đồ này nên được OK, đối với trường hợp của bạn:

@ElementCollection 
@CollectionTable(name = "user_search_list", 
       joinColumns = @JoinColumn(name = "user_id")) 
@Column(name = "search_list") 
protected Set<String> searchList; 
+0

Điều này giả định rằng Người dùng là lớp duy nhất phân lớp PropertyContainer, phải không? –

+0

Không. Hibernate đặt tên cột tham gia là "người dùng" vì nó tham gia vào một thực thể có tên là "Người dùng" –

+0

nhưng searchList thuộc về PropertyContainer, do đó người dùng và các lớp khác kế thừa nó Nếu tôi nói hibernate rằng nó nên sử dụng tên user_search_list, sau đó nó sẽ không cố gắng sử dụng tên đó cho tất cả các lớp kế thừa? –

30

user là một reserved keyword trong PostgreSQL. Chỉ được phép là quoted identifier.

Bạn phải buộc Hibernate sử dụng được trích dẫn "user" trong lệnh INSERT này.

Tôi không phải là chuyên gia Hibernate nhưng có lẽ điều này Hibernate saving User model to Postgres sẽ giúp ích?

+0

có, câu hỏi tôi liên kết đến trong bài viết ban đầu của tôi làm cho cùng một điểm. Tôi đã sử dụng chú thích @Entity (name = "XonamiUser") –

+0

Lỗi của tôi là sth như ERROR: lỗi cú pháp tại hoặc gần. Hibernate ghi đè lỗi thực sự của Po stgresql cho từ dành riêng. Tôi mất một lúc để tìm ra. –

+0

@BjornRoche Tôi nghĩ câu hỏi này tương tự như câu hỏi của bạn .. bạn có thể giúp tôi về điều này ... http: // stackoverflow.com/questions/42224949/exception-org-postgresql-util-psqlexception-lỗi-cú pháp-lỗi-at-hoặc-gần-c? noredirect = 1 # comment71610583_42224949 – dhS

Các vấn đề liên quan