Spring JPA仓库findOne()返回null?

时间:2017-03-15 13:31:21

标签: jpa spring-boot spring-data-jpa spring-repositories

我一直在寻找解决此问题的解决方案。我使用Spring数据JPA从MySQL数据库服务器检索数据。

以下是实体:

    /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.parko.timebestilling.database.entity;

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author Christian
 */
@Entity
@Table(name = "customer")
@XmlRootElement
@NamedQueries({
        @NamedQuery(name = "Customer.findAll", query = "SELECT c FROM Customer c"),
        @NamedQuery(name = "Customer.findByCID", query = "SELECT c FROM Customer c WHERE c.cID = :cID"),
        @NamedQuery(name = "Customer.findByCAdress", query = "SELECT c FROM Customer c WHERE c.cAdress = :cAdress"),
        @NamedQuery(name = "Customer.findByCEpost", query = "SELECT c FROM Customer c WHERE c.cEpost = :cEpost"),
        @NamedQuery(name = "Customer.findByCLastName", query = "SELECT c FROM Customer c WHERE c.cLastName = :cLastName"),
        @NamedQuery(name = "Customer.findByCName", query = "SELECT c FROM Customer c WHERE c.cName = :cName"),
        @NamedQuery(name = "Customer.findByCNote", query = "SELECT c FROM Customer c WHERE c.cNote = :cNote"),
        @NamedQuery(name = "Customer.findByCPhonenumber", query = "SELECT c FROM Customer c WHERE c.cPhonenumber = :cPhonenumber"),
})
public class Customer implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "cID")
    private Integer cID;
    @Size(max = 255)
    @Column(name = "cAdress")
    private String cAdress;
    @Size(max = 255)
    @Column(name = "cEpost")
    private String cEpost;
    @Size(max = 255)
    @Column(name = "cLastName")
    private String cLastName;
    @Size(max = 255)
    @Column(name = "cName")
    private String cName;
    @Size(max = 255)
    @Column(name = "cNote")
    private String cNote;
    @Size(max = 255)
    @Column(name = "cPhonenumber")
    private String cPhonenumber;
    /*
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "cid")
    private Collection<SmsHistory> smsHistoryCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "customer")
    private Collection<SmsReceivers> smsReceiversCollection;
    @OneToMany(mappedBy = "cid")
    private Collection<Reservation> reservationCollection;
    */
    public Customer() {
    }

    public Customer(Integer cID) {
        this.cID = cID;
    }

    public Customer(Integer cID, String cAdress1, String cEpost1, String cLastName1, String cName1, String cPhonenumber1) {
        this.cID = cID;
        this.cAdress = cAdress1;
        this.cEpost = cEpost1;
        this.cLastName = cLastName1;
        this.cName = cName1;
        this.cPhonenumber = cPhonenumber1;
    }

    public Integer getCID() {
        return cID;
    }

    public void setCID(Integer cID) {
        this.cID = cID;
    }

    public String getCAdress() {
        return cAdress;
    }

    public void setCAdress(String cAdress) {
        this.cAdress = cAdress;
    }

    public String getCEpost() {
        return cEpost;
    }

    public void setCEpost(String cEpost) {
        this.cEpost = cEpost;
    }

    public String getCLastName() {
        return cLastName;
    }

    public void setCLastName(String cLastName) {
        this.cLastName = cLastName;
    }

    public String getCName() {
        return cName;
    }

    public void setCName(String cName) {
        this.cName = cName;
    }

    public String getCNote() {
        return cNote;
    }

    public void setCNote(String cNote) {
        this.cNote = cNote;
    }

    public String getCPhonenumber() {
        return cPhonenumber;
    }

    public void setCPhonenumber(String cPhonenumber) {
        this.cPhonenumber = cPhonenumber;
    }

    /*

    @XmlTransient
    public Collection<SmsHistory> getSmsHistoryCollection() {
        return smsHistoryCollection;
    }

    public void setSmsHistoryCollection(Collection<SmsHistory> smsHistoryCollection) {
        this.smsHistoryCollection = smsHistoryCollection;
    }

    @XmlTransient
    public Collection<SmsReceivers> getSmsReceiversCollection() {
        return smsReceiversCollection;
    }

    public void setSmsReceiversCollection(Collection<SmsReceivers> smsReceiversCollection) {
        this.smsReceiversCollection = smsReceiversCollection;
    }

    @XmlTransient
    public Collection<Reservation> getReservationCollection() {
        return reservationCollection;
    }

    public void setReservationCollection(Collection<Reservation> reservationCollection) {
        this.reservationCollection = reservationCollection;
    }
    */
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (cID != null ? cID.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Customer)) {
            return false;
        }
        Customer other = (Customer) object;
        if ((this.cID == null && other.cID != null) || (this.cID != null && !this.cID.equals(other.cID))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.parko.timebestilling.database.entity.Customer[ cID=" + cID + " ]";
    }

}

存储库类:

package com.parko.timebestilling.database.beans;

import com.parko.timebestilling.database.entity.Customer;
import org.springframework.data.repository.CrudRepository;

/**
 * Created by christian on 15.03.2017.
 */

public interface CustomerRepository extends CrudRepository<Customer, Integer>{



}

服务类:

package com.parko.timebestilling.database.beans;

import com.parko.timebestilling.database.entity.Customer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by christian on 15.03.2017.
 */
@Service
public class CustomerService {

    @Autowired
    private CustomerRepository customerRepo;

    public List<Customer> getAllCustomers() {
        List<Customer> customers = new ArrayList<>();
        customerRepo.findAll().forEach(customers::add);
        return customers;
    }

    public Customer getTest() {
        return customerRepo.findOne(1);
    }

}

最后我称之为..

public class Welcome extends CssLayout implements View {

    public static final String VIEW_NAME = "Hjem";

    @Autowired
    CustomerService customerServ;

    public Welcome() {
        System.out.println(customerServ.getTest().getcName());
}

这是我的application.properties

# ===============================
# = DATA SOURCE
# ===============================

# Set here configurations for the database connection

# Connection url for the database "Parko"
spring.datasource.url = jdbc:mysql://localhost:3306/parko?useSSL=false

# Username and password
spring.datasource.username = root
spring.datasource.password = root

# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

# ===============================
# = JPA / HIBERNATE
# ===============================

# Use spring.jpa.properties.* for Hibernate native properties (the prefix is
# stripped before adding them to the entity manager).

# Show or not log for each sql query
spring.jpa.show-sql = true

# Hibernate ddl auto (create, create-drop, update): with "update" the database
# schema will be automatically updated accordingly to java entities found in
# the project
spring.jpa.hibernate.ddl-auto = update

# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

spring.data.jpa.repositories.enabled=true

# Allows Hibernate to generate SQL optimized for a particular DBMS
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

spring.jpa.database=mysql

# ===============================
# = SESSION
# ===============================

spring.session.store-type=none


# ===============================
# = VAADIN
# ===============================
vaadin.servlet.productionMode=true

然而,当我的程序调用它时,findOne方法返回null。确实存在数据库中具有主键1的客户记录,因此情况并非如此。我希望我已经包含了你们发现问题所需的一切。我使用Vaadin来创建我的内容。如果这是要看的东西..

1 个答案:

答案 0 :(得分:0)

尝试将您的服务标记为交易:

@Service
@Transactional
public class CustomerService {

只读方法标记为:

@Transactional(readOnly = true)
public Customer getTest() {
    return customerRepo.findOne(1);
}