【问题标题】:JoiningTables using jpa and hibernate problem is mulitmapping failedJoiningTables 使用 jpa 和休眠问题是多映射失败
【发布时间】: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


【解决方案1】:

预订实体。

 @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-link 将使用字段名称,因此,在这种情况下,您将拥有 2 个指向同一列的 java 属性。

@JoinColumn 为您完成了繁琐的工作(引用引用 SQL 表的其他实体),这就是我们使用 JPA 的原因。

我将表示主键的字段从 int 更改为 Integer 类。 你可以在这里找到原因:What's difference between primitive and wrapper class in JPA (Hibernate) column mappings?

【讨论】:

  • 感谢您的努力。非常感谢
猜你喜欢
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 2018-01-29
  • 2011-01-31
  • 1970-01-01
  • 2011-01-30
相关资源
最近更新 更多