Spring数据休息与Jpa关系

时间:2017-03-09 05:55:23

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

Followed this question but did not work

有两个实体Account和UserTransaction

Account.java

@Entity
@Access(AccessType.FIELD)
public class Account {

    @Id
    private Integer accountNumber;
    private String holderName;
    private String mobileNumber;
    private Double balanceInformation;


    public Account(Integer accountNumber, String holderName, String mobileNumber, Double balanceInformation) {
        this.accountNumber = accountNumber;
        this.holderName = holderName;
        this.mobileNumber = mobileNumber;
        this.balanceInformation = balanceInformation;
    }
}

UserTransaction.java

@Entity
@Access(AccessType.FIELD)
@Table(name = "user_transaction")
public class Transaction {

    @Id
    private Long transactionId;
    @ManyToOne
    @JoinColumn(name = "accountNumber")
    private Account accountNumber;
    private Double transactionAmount;

    @Column(nullable = false, columnDefinition = "TINYINT", length = 1)
    private Boolean transactionStatus;

    private String statusMessage;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="timestamp", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
    private Date timestamp;

    public Transaction(Long transactionId, Account account,
                       Double transactionAmount,
                       Boolean transactionStatus,
                       String statusMessage) {
        this.transactionId = transactionId;
        this.accountNumber = account;
        this.transactionAmount = transactionAmount;
        this.transactionStatus = transactionStatus;
        this.statusMessage = statusMessage;
    }
}

和我的TransactionRepository如下

@RepositoryRestResource(collectionResourceRel = "transactions", path = "transactions")
public interface JpaTransactionRepository extends JpaRepository<Transaction, Long>, TransactionRepository {

    @Query(value =  "select t from Transaction t where t.accountNumber.accountNumber = :accountNumber")
    Iterable<Transaction> findByAccountNumber(@Param("accountNumber") Integer accountNumber);

}

我已经构建了一个json,如顶部的stackoverflow帖子中所指定的那样

{
      "transactionId" : "3213435454342",
      "transactionAmount" : 5.99,
      "transactionStatus" : true,
      "statusMessage" : null,
      "timestamp" : "2017-03-09T05:11:41.000+0000",
      "accountNumber" : "http://localhost:8080/accounts/90188977"
}

当我尝试使用上面的json执行POST时我得到了

Caused by: java.sql.SQLIntegrityConstraintViolationException: Column 'account_number' cannot be null
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:533)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:513)
        at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:115)
        at com.mysql.cj.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:1983)

如何保存与Spring数据有关系的实体????

1 个答案:

答案 0 :(得分:1)

问题是,对于@JoinColumn(name = "accountNumber"),您会将数据库中的列名称硬编码为accountNumber。通常,命名策略会添加嵌入式下划线,而不是具有混合大小写列名称。 因此,如果您将行更改为@JoinColumn(name = "account_number")

,它应该可以工作