【发布时间】:2020-06-27 01:21:23
【问题描述】:
两个月前我刚开始学习 java ee,我在某些方面很挣扎,如下所示。 我有三个用于预订系统的实体类,在完成一些逻辑后,我在努力运行项目:
@Entity
@Table(name="booking")
public class Booking implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int reservationId;
private String stateroomType;
private double totalAmount;
private int totalGuests;
private int shipId;
private int passId;
//Joining Tables
@OneToOne
@JoinColumn(name="passId")
private Passenger passenger;
@ManyToOne
@JoinColumn(name="shipId")
private Cruise cruise;
@Entity
@Table(name = "shipcruise")
public class Cruise implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int cruiseId;
private String cruiseName;
private LocalDate startDate;
private LocalDate endDate;
private Timestamp destination;
@Entity
@Table(name = "passengers")
public class Passenger implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int passengerId;
private String userName;
private String firstname;
private String lastname;
private String address;
private String city;
private String country;
private String postalCode;
private String password;
当我运行我的项目时,我收到以下错误消息:
异常 [EclipseLink-48] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DescriptorException 异常描述:字段 [booking.SHIPID] 存在多个可写映射。只有一个可以定义为可写,所有其他必须指定为只读。 映射:org.eclipse.persistence.mappings.OneToOneMapping[cruise] 描述符:RelationalDescriptor(com.springmvc.jpa.booking.Booking --> [DatabaseTable(booking)]) 异常 [EclipseLink-48] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DescriptorException 异常描述:字段 [booking.PASSID] 存在多个可写映射。只有一个可以定义为可写,所有其他必须指定为只读。 映射:org.eclipse.persistence.mappings.OneToOneMapping[passenger] 描述符:RelationalDescriptor(com.springmvc.jpa.booking.Booking --> [DatabaseTable(booking)])
.................................................. .....................................................
我了解映射存在问题,我对此进行了一些研究,但仍然不知道如何解决它或如何建立实体类之间的关系。谁能帮我找出问题并解决它。
数据库表:
CREATE TABLE `booking` (
`reservationId` int NOT NULL,
`stateroomType` varchar(30) NOT NULL,
`totalGuests` int NOT NULL,
`totalAmount` decimal(10,2) NOT NULL,
`passId` int DEFAULT NULL,
`shipId` int DEFAULT NULL,
PRIMARY KEY (`reservationId`),
KEY `passId` (`passId`),
KEY `shipId` (`shipId`),
CONSTRAINT `booking_ibfk_1` FOREIGN KEY (`passId`) REFERENCES
`passengers` (`passengerId`),
CONSTRAINT `booking_ibfk_2` FOREIGN KEY (`shipId`) REFERENCES
`shipcruise` (`cruiseId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `passengers` (
`passengerId` int NOT NULL AUTO_INCREMENT,
`userName` varchar(50) DEFAULT NULL,
`password` varchar(25) DEFAULT NULL,
`firstname` varchar(30) DEFAULT NULL,
`lastname` varchar(30) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
`city` varchar(25) DEFAULT NULL,
`postalCode` varchar(10) DEFAULT NULL,
`country` varchar(20) DEFAULT NULL,
PRIMARY KEY (`passengerId`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `shipcruise` (
`cruiseId` int NOT NULL AUTO_INCREMENT,
`CruiseName` varchar(50) DEFAULT NULL,
`shipName` varchar(50) DEFAULT NULL,
`startDate` date NOT NULL,
`endDate` date NOT NULL,
`destination` timestamp NOT NULL,
PRIMARY KEY (`cruiseId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
【问题讨论】:
-
嗨,欢迎来到 StackOverflow。在实体 Booking 中,您定义了两个指向数据库中同一列的字段。私人 int shipId;和@JoinColumn(name="passId") 私人乘客;不指定列名时,JPA 使用属性名。
-
感谢您的回复。我对这些关系感到困惑。您能否举个例子来说明这一点。我已将数据库中的 shipId 和 passId 加入到预订表中。
-
我的错。我复制并粘贴了不正确的属性。您拥有 ManyToOne JoinColumn(name="shipId") 私人 Cruise Cruise;等同于:private int shipId;
-
我试图以这种方式加入,但它给出了一个错误,所以我不得不在预订实体类中声明 shId 和 passId。
-
我收到此错误消息::: Join column "shipId" cannot be resolve on table "booking"
标签: java mysql spring-mvc jpa