2014-05-04 17 views
6

Tôi đang sử dụng spring-data-jpa trên dự án webmvc mùa xuân. Tôi đang gặp sự cố khi sử dụng query creation trên một Kho lưu trữ của một trong các thực thể của tôi. Dưới đây bạn có thể thấy thực thể của tôi, Repository của tôi và ngoại lệ.Kho lưu trữ Spring-Data-Jpa - Gạch dưới tên cột thực thể

My Entity,

@Entity 
@Table(schema = "mainschema") 
@XmlRootElement 
public class Municipalperson implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(nullable = false) 
    private Integer id; 

    @Basic(optional = false) 
    @Column(name = "municipal_id", nullable = false) 
    private Integer municipal_id; 

    @Basic(optional = false) 
    @Column(nullable = false, length = 60) 
    private String firstname; 

    public Municipalperson(Integer id, Integer municipal_id, String firstname) { 
     this.id = id; 
     this.municipal_id = municipal_id; 
     this.firstname = firstname; 
    } 


    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public Integer getMunicipal_id() { 
     return municipal_id; 
    } 

    public void setMunicipal_id(Integer municipal_id) { 
     this.municipal_id = municipal_id; 
    } 

    public String getFirstname() { 
     return firstname; 
    } 

    public void setFirstname(String firstname) { 
     this.firstname = firstname; 
    } 
} 

Repository của tôi,

@Repository 
public interface MunicipalpersonRepository extends JpaRepository<Municipalperson, Integer> { 

    List<Municipalperson> findByMunicipal_idOrderByLastnameDesc(int municipal_id); 
} 

và ngoại lệ,

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'municipalpersonRepository': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property municipal found for type Municipalperson! 

Tôi cố gắng để thiết lập mynicipal_id như int, sau đó là Integer và tương tự cho tham số 'municipal_id' trên Repository của tôi, nhưng tất cả chúng đều không hoạt động. Ngoài ra, tôi đổi tên Repository thành 'findByMunicipalidOrderByLastnameDesc' và 'findByMunicipalIdOrderByLastnameDesc' nhưng nó không hoạt động.

Cuối cùng tôi đổi tên các municipal_id để municipalId (gạch bỏ) và cũng có thể đổi tên getters/setters và Repository (findByMunicipalIdOrderByLastnameDesc) và vấn đề giải quyết.

Câu hỏi của tôi là tại sao điều này xảy ra?

+1

JPA dữ liệu Spring dựa nhiều vào quy ước đặt tên Java. Bạn đã chọn không tôn trọng họ bằng cách có dấu gạch dưới trong tên trường và tên người truy cập của bạn. Đó là lý do tại sao bạn bị cắn. Tôn trọng các quy ước đặt tên Java và JPA dữ liệu mùa xuân sẽ được hạnh phúc và mã của bạn sẽ dễ đọc hơn như một phần thưởng. Không phải là cột có thể được đặt tên theo ý muốn của bạn, bao gồm cả dấu gạch dưới. Điều quan trọng là tên trường được ánh xạ của bạn. –

+0

Cảm ơn bạn rất nhiều vì đã bình luận. Tôi không biết về các quy ước đặt tên java. Tôi cũng tìm thấy [câu hỏi stackoverflow] này (http://stackoverflow.com/questions/150192/using-underscores-in-java-variables-and-method-names) đã giúp tôi. –

Trả lời

20

Dấu gạch dưới _ là ký tự dành riêng trong truy vấn truy vấn dữ liệu Spring (xem số reference docs để biết chi tiết) để có khả năng cho phép mô tả đường dẫn thuộc tính thủ công. Vì vậy, có hai tùy chọn bạn có:

  1. Gắn vào các quy ước đặt tên Java bằng cách sử dụng camel-case cho tên biến thành viên và mọi thứ sẽ hoạt động như mong đợi.
  2. Thoát khỏi _ bằng cách sử dụng dấu gạch dưới bổ sung, tức là đổi tên phương thức truy vấn của bạn thành findByMunicipal__idOrderByLastnameDesc(…).

Tôi muốn giới thiệu trường hợp cũ vì bạn sẽ không xa lánh các nhà phát triển Java đồng nghiệp :).

+6

Điều này không hoạt động. Dấu gạch dưới kép không thay đổi bất cứ điều gì. Và các trường trong đối tượng Java JPA chỉ cần theo tên của các trường trong cơ sở dữ liệu rõ ràng là không tuân theo quy ước Java. Vì vậy, đó phải là một trường hợp sử dụng khá phổ biến. –

+1

Xin lỗi nhưng dấu gạch dưới kép không hoạt động. – Daniel

+0

Giải pháp đôi gạch dưới không hoạt động đối với tôi và tôi không thể hoàn tác upvote của mình ... – Zerlono

11

Tôi đã giải quyết lỗi này bằng cách đổi tên trường thành tên không có dấu gạch dưới.

@Column(name = "municipal_id", nullable = false) 
private Integer municipalId; // <-- field was renamed 
+1

Đây thực sự là cách tốt nhất để xử lý kịch bản này và phải là câu trả lời được chấp nhận.Tôi nhận ra câu trả lời này đã đến một vài năm sau câu hỏi và câu trả lời đầu tiên, nhưng tôi đang đưa ra nhận xét này để thu hút sự chú ý của các khách truy cập trong tương lai vào câu trả lời này. Giải quyết theo cách này cho phép bạn làm việc với các cơ sở dữ liệu đặt tên các trường theo cách bạn không thể kiểm soát, mà không bị lệch khỏi các tiêu chuẩn mã hóa thường được chấp nhận trên toàn bộ trường của các nhà phát triển java, ví dụ: giữ gạch dưới hoàn toàn ra khỏi phương pháp của bạn và tên biến. –

+0

Cách tốt nhất để xóa lỗi mà không thay đổi cơ sở dữ liệu và tất cả các công cụ lập bản đồ. –

+0

Trả lời nhận xét đầu tiên, câu hỏi không phải là "cách ánh xạ tên cột db với dấu gạch dưới đến một thực thể Java" nhưng cách sử dụng thuộc tính thực thể với dấu gạch dưới với dữ liệu mùa xuân. Đó là lý do tại sao câu trả lời này không được chấp nhận. –

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