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

Java 使用jpa和hibernate连接表的问题是多重映射失败,java,mysql,spring-mvc,jpa,Java,Mysql,Spring Mvc,Jpa,我两个月前才开始学习JavaEE,我在某些方面遇到了困难,如下所示。 我有三个实体类用于预订系统,在我完成了一些逻辑之后,我在运行项目方面遇到了困难: @Entity @Table(name="booking") public class Booking implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private in

我两个月前才开始学习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] 描述符:RelationalDescriptor(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[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;
预订实体

 @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类。 您可以在这里找到原因:

预订实体

 @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类。
您可以在这里找到原因:

您好,欢迎来到StackOverflow。在实体预订中,您定义了两个字段,它们指向数据库中的同一列。私人国际船舶识别号;和@JoinColumn(name=“passId”)私人乘客;如果不指定列的名称,JPA将使用属性名。感谢您的回复。我对这些关系感到困惑。你能举例说明一下吗。我将数据库中的shipId和passId加入到预订表中。我的坏消息。我复制并粘贴了不正确的属性。您拥有Manytone JoinColumn(name=“shipId”)私人游轮;这与:private int shipId相同;我试图以这种方式加入,但它给出了一个错误,因此我必须在booking实体类中声明shId和passId。我收到以下错误消息:::无法在表“booking”上解析加入列“shipId”,欢迎使用StackOverflow。在实体预订中,您定义了两个字段,它们指向数据库中的同一列。私人国际船舶识别号;和@JoinColumn(name=“passId”)私人乘客;如果不指定列的名称,JPA将使用属性名。感谢您的回复。我对这些关系感到困惑。你能举例说明一下吗。我将数据库中的shipId和passId加入到预订表中。我的坏消息。我复制并粘贴了不正确的属性。您拥有Manytone JoinColumn(name=“shipId”)私人游轮;这与:private int shipId相同;我试图以这种方式加入,但出现了一个错误,因此我必须在booking实体类中声明shId和passId。我收到以下错误消息:::无法在表“booking”上解析加入列“shipId”。我感谢您的努力。谢谢你的努力。谢谢