使用jpa和hibernate连接表的问题是多重映射失败



我两个月前刚开始学习javaee,我在某些方面遇到了困难,如下所示。我有三个预订系统的实体类,在完成一些逻辑后,我在运行项目时遇到了困难:

@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持久性服务-2.5.2.v20140319-9ad6abd(:org.Eclipse.Persistence.exceptions.DescriptorException异常描述:字段[booking.SHIPID]存在多个可写映射。只能将其中一个定义为可写映射,其他所有映射都必须指定为只读映射。映射:org.eclipse.persistence.mappings.OneToOneMapping[cruise]描述符:关系描述符(com.springmvc.jpa.booking.booking-->[DatabaseTable(booking(](异常[EclipseLink-48](Eclipse持久性服务-2.5.2.v20140319-9ad6abd(:org.Eclipse.Persistence.exceptions.DescriptorException异常描述:字段[booking.PASSID]存在多个可写映射。只能将其中一个定义为可写映射,其他所有映射都必须指定为只读映射。映射:org.eclipse.persistence.mappings.OneToOneMapping[乘客]描述符:关系描述符(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;

预订实体。

@Entity
@Table(name="booking")
public class Booking implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer reservationId;
private String stateroomType;
private double totalAmount;
private int totalGuests;   
//Joining Tables
@ManyToOne
@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 Integer 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 Integer passengerId;
private String userName;
private String firstname;

在你的代码中,你有:

private int shipId;
private int passId;

在下面,你有:

//Joining Tables
@OneToOne
@JoinColumn(name="passId")
private Passenger passenger;
@ManyToOne
@JoinColumn(name="shipId")
private Cruise cruise;

当您不使用@Column或@JoinColumn时,eclipse链接将使用字段名,因此,在本例中,您将有两个指向同一列的java属性。

@JoinColumn为您做了一些肮脏的工作(引用引用SQL表的另一个实体(,这就是我们使用JPA的原因。

我将表示主键的字段从int改为Integer类。你可以在这里找到原因:What';JPA(Hibernate(列映射中的基元类和包装类之间的区别是什么?

相关内容

最新更新