2017-01-20 6 views
0

私のアプリケーションでSpring Bootを使用しています。私はSpringのJPAのCrudRepositoryの実装にアクセスするサービス層にアクセスするコントローラを持っています。これはHibernateと対話してデータベースからデータをフェッチします。 CrudRepositoryの次の実装のすべての3つは、間違ったオブジェクトを返す:Springブート:Springデータを使用してデータを読み込むJPAが不正な値を返します

public class ProductRepositoryImpl implements ProductRepository { 

    @Autowired 
    private SessionFactory sessionFactory; 

    @SuppressWarnings("unchecked") 
    public List<Product> findProductBatch(int start, int end) { 
     Session session = sessionFactory.getCurrentSession(); 
     Query query = session.createQuery("from Product"); 
     query.setFirstResult(start); 
     query.setMaxResults(end); 
     List<Product> list = query.list(); 
     return list; 
    } 

    @SuppressWarnings({ "unused", "unchecked" }) 
    @Override 
    public Iterable<Product> findAll() { 
     Session session = sessionFactory.getCurrentSession(); 
     List<Product> products = session.createQuery("from Product").list(); 
     Iterable<Product> productIterable = products; 
     return products; 
    } 

    @SuppressWarnings("unchecked") 
    public List<Product> findBatch(int start, int end) { 
     Session session = sessionFactory.getCurrentSession(); 
     Query query = session.createQuery("from Product"); 
     query.setFirstResult(start); 
     query.setMaxResults(end); 
     List<Product> list = query.list(); 
     return list; 
    } 

} 

レコードのidがゼロではないながら、findOne()メソッドは、渡されたパラメータがゼロである場合にのみ、レコードを返します。次のようなJSONレスポンスが要求を送信すると返されます。

{ 
    "productId": 0, 
    "name": "xxxxxx", 
    "productCategoryId": null, 
    "created": 1482655958000, 
    "createdBy": null 
} 

レコードがデータベースに存在するが、そのIDが1であり、それは「productCategoryId」を持っていませんが、それが注入されていなかったので、nullを返しました。

findAll()メソッドは同じレコードを何度も繰り返し返し、findBatch()メソッドは同様の応答を返します。

ここで残りのコードです:

Product.java:

@Entity 
public class Product { 

    @Id 
    private Integer productId; 
    private String name; 
    private Integer productCategoryId; 
    @OneToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "productCategoryId", insertable = false, updatable = false) 
    @Autowired 
    private ProductCategory productCategory; 
    private Date created; 
    private Integer createdBy; 

    public Product() { 
    } 

    public Product(Integer productId, String name, ProductCategory productCategory, Integer uomId, Date created, Integer createdBy) { 
     this.productId = productId; 
     this.name = name; 
     this.productCategory = productCategory; 
     this.created = created; 
     this.createdBy = createdBy; 
    } 

    public Product(String name, ProductCategory productCategory) { 
     this.name = name; 
     this.productCategory = productCategory; 
    } 

    public Integer getProductId() { 
     return productId; 
    } 

    public void setProductId(Integer productId) { 
     this.productId = productId; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Integer getProductCategoryId() { 
     return productCategoryId; 
    } 

    public void setProductCategoryId(Integer productCategoryId) { 
     this.productCategoryId = productCategoryId; 
    } 

// public ProductCategory getProductCategory() { 
//  return productCategory; 
// } 
// 
// public void setProductCategory(ProductCategory productCategory) { 
//  this.productCategory = productCategory; 
// } 

    public Date getCreated() { 
     return created; 
    } 

    public void setCreated(Date created) { 
     this.created = created; 
    } 

    public Integer getCreatedBy() { 
     return createdBy; 
    } 

    public void setCreatedBy(Integer createdBy) { 
     this.createdBy = createdBy; 
    } 
} 

ProductCategory.java:

@Entity 
    public class ProductCategory { 

    @Id 
    private Integer productCategoryId; 
    private String name; 
    private Date created; 
    private Integer createdBy; 

    public ProductCategory() { 
    } 

    public ProductCategory(Integer productCategoryId, String name, Date created, Integer createdBy) { 
     this.productCategoryId = productCategoryId; 
     this.name = name; 
     this.created = created; 
     this.createdBy = createdBy; 
    } 

    public Integer getProductCategoryId() { 
     return productCategoryId; 
    } 

    public void setProductCategoryId(Integer productCategoryId) { 
     this.productCategoryId = productCategoryId; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Date getCreated() { 
     return created; 
    } 

    public void setCreated(Date created) { 
     this.created = created; 
    } 

    public Integer getCreatedBy() { 
     return createdBy; 
    } 

    public void setCreatedBy(Integer createdBy) { 
     this.createdBy = createdBy; 
    } 
} 

ProductServiceImpl.java

@Service 
@Transactional 
public class ProductServiceImpl implements ProductService { 



@Autowired 
    private ProductRepository productRepository; 

    public Product findOne(int productId) { 
     return productRepository.findOne(productId); 
    } 

    public List<Product> findAll() { 
     List<Product> products = new ArrayList<>(); 
     productRepository.findAll().forEach(products::add); 
     return products; 
    } 

    @Override 
    public List<Product> findBatch(int start, int end) { 
     return productRepository.findBatch(start, end); 
    } 
} 

ProductController.javaは、 :

@RestController 
@RequestMapping("/products") 
@EnableTransactionManagement 
public class ProductController { 

    @Autowired 
    private ProductService productService; 

    @RequestMapping(method = RequestMethod.GET) 
    public List<Product> findAll() { 
     List<Product> products = productService.findAll(); 
     return products; 
    } 

    @RequestMapping(value = "/{productId}", method = RequestMethod.GET) 
    public Product findOne(@PathVariable int productId) { 
     Product product = productService.findOne(productId); 
     return product; 
    } 

    @RequestMapping(value = "/{start}/{end}", method = RequestMethod.GET) 
    public List<Product> findBatch(@PathVariable int start, @PathVariable int end) { 
     List<Product> list = productService.findBatch(start, end); 
     return list; 
    } 
} 

ApplicationContextConfig.java:

public class ApplicationContextConfig { 

    @Bean 
    public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) { 
     HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean(); 
     factory.setEntityManagerFactory(emf); 
     return factory; 
    } 
} 

応答はまた、そうでないフル注入さProductCategoryオブジェクトが含まれている必要があります。

+0

これはおそらくすでにチェックされていますが、これは常に私の最初のステップです。データベースJPAが接続していることを100%確信していますか? – Bohemian

+0

はい、読み取り中のレコードがデータベースに存在します。 –

+0

私は、リクエストのマッピングを変更すると、findBatch()メソッドが同じデータベースから異なる値を読み込むことに気付きました。 localhost:8080/0/10は、ローカルホストから別のオブジェクトを返します。1/10。彼らは両方とも10回繰り返される別のレコードを返す –

答えて

1

だから、最終的には、解決策は私のapplication.propertiesファイルにこれを追加しました:二行目は、休止状態、デフォルトの命名戦略を変更しながら、

spring.jpa.hibernate.ddl-auto=validate 
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

最初の行は、その構造を変更することなく、列の存在をチェックしますテーブル名にアンダースコアを追加することを検証し、回避します。

関連する問題