尝试多对一实体映射时出现未知列错误
Unknown Column Error while attempting a many-to-one entity mapping
我关注了这个example, renaming Student to Journey, and renaming Library to Station. My interpretation of the error is, the table schema does not have a field called 'departure' while the java class representation does. I didn't expect this to be a problem because I followed the JPA naming convention mentioned in this 。在示例的情况下, lib + b_id == LIB_B_ID 。在我的例子中, department + station_id == department_station_id (我的数据库命名方案使用小写)。
与示例的其他显着差异,我没有 persistence.xml,对于 id,我使用 GenerationType.IDENTITY 而不是 GenerationType.AUTO。
错误
java.sql.SQLException: Unknown column 'departure' in 'field list'
架构脚本
CREATE TABLE `station` (
`station_id` bigint(20) NOT NULL AUTO_INCREMENT,
`locker_id` bigint(20) DEFAULT NULL,
`station_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`station_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2579 DEFAULT CHARSET=utf8
CREATE TABLE `journey` (
`journey_id` bigint(20) NOT NULL AUTO_INCREMENT,
`departure_station_id` bigint(20) DEFAULT NULL,
`destination_station_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`journey_id`),
KEY `station_id_departure` (`departure_station_id`),
KEY `station_id_destination` (`destination_station_id`),
CONSTRAINT `journey_ibfk_1` FOREIGN KEY (`destination_station_id`) REFERENCES `station` (`station_id`),
CONSTRAINT `journey_ibfk_2` FOREIGN KEY (`departure_station_id`) REFERENCES `station` (`station_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
旅程
@Entity
public class Journey implements Serializable{//Serializable required by @JoinColumn
//Station
public Journey(Station departure, Station destination){
this.departure = departure;
this.destination = destination;
}
//List<Station>
public Journey(List<Station> journeyStationList){
departure = journeyStationList.get(0);//0 is first index
destination = journeyStationList.get(journeyStationList.size() - 1);//-1 because first index of List is 0
}
private Long journeyId;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getJourneyId(){
return journeyId;
}
public void setJourneyId(Long journeyId){
this.journeyId = journeyId;
}
@ManyToOne
private Station departure;
public Station getDeparture(){
return departure;
}
public void setDeparture(Station departure){
this.departure = departure;
}
@ManyToOne
private Station destination;
public Station getDestination(){
return destination;
}
public void setDestination(Station destination){
this.destination = destination;
}
}
车站
@Entity
public class Station implements Serializable{//Serializable required by @JoinColumn
public Station(){//default constructor needed for JPA query
}
public Station(String stationName){
setStationName(stationName);
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long stationId;
public Long getStationId(){
return stationId;
}
public void setStationId(Long stationId){
this.stationId = stationId;
}
private String stationName;
public String getStationName(){
return stationName;
}
public void setStationName(String stationName){
this.stationName = stationName;
}
}
与我交叉引用的两个示例相反 A and B, I noticed in this @ManyToOne 注释位于 getter 之上,而不是字段的声明。因为我当前工作的注释(@id 和@GeneratedValue)也在 getter 之上,所以它似乎是一个合理的解决方案。将注释移动到 getter 后,错误消失了。
这些例子并没有错,它们只是使用了一种不同的访问策略,而不是我通过将 @id 注释放在 getter 之上而无意中隐式设置的策略。通过将我的 @id 注释放在 getter 之上,我隐式指定了基于 属性 的访问,导致休眠调用 getter 和 setter 方法来访问我的属性,因此我的 @ ManyToOne 注释必须在 getter 之上。我引用的示例将 @id 注释放置在 class 变量本身之上,隐式指定基于字段的访问,在这种情况下,您应该将 @ManyToOne 注释放置在 class 变量工作之上。 Source
我关注了这个example, renaming Student to Journey, and renaming Library to Station. My interpretation of the error is, the table schema does not have a field called 'departure' while the java class representation does. I didn't expect this to be a problem because I followed the JPA naming convention mentioned in this
与示例的其他显着差异,我没有 persistence.xml,对于 id,我使用 GenerationType.IDENTITY 而不是 GenerationType.AUTO。
错误
java.sql.SQLException: Unknown column 'departure' in 'field list'
架构脚本
CREATE TABLE `station` (
`station_id` bigint(20) NOT NULL AUTO_INCREMENT,
`locker_id` bigint(20) DEFAULT NULL,
`station_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`station_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2579 DEFAULT CHARSET=utf8
CREATE TABLE `journey` (
`journey_id` bigint(20) NOT NULL AUTO_INCREMENT,
`departure_station_id` bigint(20) DEFAULT NULL,
`destination_station_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`journey_id`),
KEY `station_id_departure` (`departure_station_id`),
KEY `station_id_destination` (`destination_station_id`),
CONSTRAINT `journey_ibfk_1` FOREIGN KEY (`destination_station_id`) REFERENCES `station` (`station_id`),
CONSTRAINT `journey_ibfk_2` FOREIGN KEY (`departure_station_id`) REFERENCES `station` (`station_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
旅程
@Entity
public class Journey implements Serializable{//Serializable required by @JoinColumn
//Station
public Journey(Station departure, Station destination){
this.departure = departure;
this.destination = destination;
}
//List<Station>
public Journey(List<Station> journeyStationList){
departure = journeyStationList.get(0);//0 is first index
destination = journeyStationList.get(journeyStationList.size() - 1);//-1 because first index of List is 0
}
private Long journeyId;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getJourneyId(){
return journeyId;
}
public void setJourneyId(Long journeyId){
this.journeyId = journeyId;
}
@ManyToOne
private Station departure;
public Station getDeparture(){
return departure;
}
public void setDeparture(Station departure){
this.departure = departure;
}
@ManyToOne
private Station destination;
public Station getDestination(){
return destination;
}
public void setDestination(Station destination){
this.destination = destination;
}
}
车站
@Entity
public class Station implements Serializable{//Serializable required by @JoinColumn
public Station(){//default constructor needed for JPA query
}
public Station(String stationName){
setStationName(stationName);
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long stationId;
public Long getStationId(){
return stationId;
}
public void setStationId(Long stationId){
this.stationId = stationId;
}
private String stationName;
public String getStationName(){
return stationName;
}
public void setStationName(String stationName){
this.stationName = stationName;
}
}
与我交叉引用的两个示例相反 A and B, I noticed in this
这些例子并没有错,它们只是使用了一种不同的访问策略,而不是我通过将 @id 注释放在 getter 之上而无意中隐式设置的策略。通过将我的 @id 注释放在 getter 之上,我隐式指定了基于 属性 的访问,导致休眠调用 getter 和 setter 方法来访问我的属性,因此我的 @ ManyToOne 注释必须在 getter 之上。我引用的示例将 @id 注释放置在 class 变量本身之上,隐式指定基于字段的访问,在这种情况下,您应该将 @ManyToOne 注释放置在 class 变量工作之上。 Source