【发布时间】:2016-12-08 17:43:31
【问题描述】:
我有两个表 User 和 Customer,它们从 MySQL 中的 User 扩展而来,在 Spring Data JPA 中实现,我创建了一个简单的 REST 控制器来测试将数据发布到数据库。
用户
package mk.klikniobrok.models;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Date;
import java.sql.Timestamp;
/**
* Created by andrejnaumovski on 12/8/16.
*/
@Entity
@Table(name = "user")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class User {
@Id
private String username;
private String password;
private int enabled;
@Column(name = "date_created", insertable = false, updatable = false)
@Basic(optional = false)
@Temporal(TemporalType.TIMESTAMP)
private java.util.Date dateCreated;
@Column(name = "last_used")
@Temporal(TemporalType.TIMESTAMP)
private java.util.Date lastUsed;
@Enumerated
private Role role;
public User() {
}
public User(
String username,
String password,
int enabled,
java.util.Date dateCreated,
java.util.Date lastUsed,
Role role
) {
this.username = username;
this.password = password;
this.enabled = enabled;
this.dateCreated = dateCreated;
this.lastUsed = lastUsed;
this.role = role;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int isEnabled() {
return enabled;
}
public void setEnabled(int enabled) {
this.enabled = enabled;
}
@Column(name = "date_created")
public java.util.Date getDateCreated() {
return dateCreated;
}
public void setDateCreated(Timestamp dateCreated) {
this.dateCreated = dateCreated;
}
@Column(name = "last_used")
public java.util.Date getLastUsed() {
return lastUsed;
}
public void setLastUsed(Timestamp lastUsed) {
this.lastUsed = lastUsed;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
客户
package mk.klikniobrok.models;
import javax.persistence.*;
/**
* Created by andrejnaumovski on 12/8/16.
*/
@Entity
@Table(name = "customer")
public class Customer extends User {
@Column(name = "email")
private String email;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "image_url")
private String imageUrl;
public Customer() {
super();
}
public Customer(String username,
String password,
int enabled,
java.util.Date dateCreated,
java.util.Date lastUsed,
Role role,
String email,
String firstName,
String lastName,
String imageUrl
) {
super(username, password, enabled, dateCreated, lastUsed, role);
this.email = email;
this.firstName = firstName;
this.lastName = lastName;
this.imageUrl = imageUrl;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
}
数据库架构:
CREATE TABLE `user` (
`username` varchar(50) NOT NULL,
`password` varchar(200) NOT NULL,
`enabled` tinyint(1) NOT NULL,
`date_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_used` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`role` varchar(50) NOT NULL,
PRIMARY KEY (`username`)
)
CREATE TABLE `customer` (
`username` varchar(50) NOT NULL,
`email` varchar(50) NOT NULL,
`first_name` varchar(50) DEFAULT NULL,
`last_name` varchar(50) DEFAULT NULL,
`image_url` varchar(200) DEFAULT NULL,
PRIMARY KEY (`username`),
UNIQUE KEY `email` (`email`),
CONSTRAINT `customer_ibfk_1` FOREIGN KEY (`username`) REFERENCES `user` (`username`)
)
使用 Postman 向控制器发送 POST 请求,这是我得到的响应:
{
"timestamp": 1481218619875,
"status": 500,
"error": "Internal Server Error",
"exception": "org.springframework.dao.InvalidDataAccessResourceUsageException",
"message": "could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet",
"path": "/customer/"
}
我得到的错误是:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'customer0_.date_created' in 'field list'
我在 StackOverflow 上检查了大多数答案,但问题似乎发生在连接表和其他更复杂的操作上,而不是这么简单。有什么建议吗?
【问题讨论】:
-
表的架构是什么?
-
API 在做什么?
-
@AkashdeepSaluja 我已将架构添加到原始帖子中。 API 仅通过 CrudRepository 将简单的 POST 保存到数据库。
-
只是一个疑问,如果您有两个表,为什么要使用鉴别器?我猜你很清楚它的存在。
-
@AkashdeepSaluja 我已经根据我的想法编辑了代码,除了现在我在另一个字段'customer0_.date_created'上遇到错误。
标签: java mysql spring spring-boot spring-data-jpa