I am trying to persist an entity using following code
public ReservationEntity persistReservation(ReservationRequest reservationRequest) {
ReservationEntity re = new ReservationEntity();
re.setTotalPrice(new BigDecimal(123));
re.setFlightInstance(getFlightInstanceEntity(reservationRequest.getFlightId()));
List<PassengerEntity> passengers = new ArrayList<>();
for (Passenger p : reservationRequest.getPassengers()){
PassengerEntity pe = new PassengerEntity();
pe.setFirstName(p.getFirstName());
pe.setLastName(p.getLastName());
passengers.add(pe);
}
re.setPassenger(passengers);
em.getTransaction().begin();
em.persist(re);
em.getTransaction().commit();
return re;
}
And the Passenger entity is
@Entity
@Table(name = "passenger", schema = "", catalog = "dbname")
public class PassengerEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator="passengerId")
private int passengerId;
private String firstName;
private String lastName;
// GETTERS-SETTERS
}
@Entity
@Table(name = "reservation", schema = "", catalog = "dbname")
public class ReservationEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "reservationId")
private int reservationId;
@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinColumn(name="passengerId")
private List<PassengerEntity> passenger;
public void setPassenger(List<PassengerEntity> passenger){this.passenger = passenger;}
public List<PassengerEntity> getPassenger(){return this.passenger;}
I have tried with GenerationType.AUTO
and with GenerationType.Sequence
and in both case, either I got an error that table PassengerEntity.SEQUENCE doesn't exist
(JPA EclipseLink DatabaseException: 'table foo.SEQUENCE doesn't exist')
I tried adding these lines and it actually deleted my entire schema with the data ...
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
<property name="eclipselink.create-ddl-jdbc-file-name" value="createDDL_ddlGeneration.jdbc"/>
<property name="eclipselink.drop-ddl-jdbc-file-name" value="dropDDL_ddlGeneration.jdbc"/>
<property name="eclipselink.ddl-generation.output-mode" value="both"/>
And here is my schema of that specific table. The table has an FK which is having the same problem. I am trying to first persist into parent and then child.
CREATE TABLE `passenger`(
`passengerId` INT NOT NULL AUTO_INCREMENT,
`firstName` VARCHAR(45) NOT NULL,
`LastName` VARCHAR(45) NOT NULL,
`reservationId` INT NOT NULL,
PRIMARY KEY (`passengerId`),
INDEX `reservationId_idx` (`reservationId` ASC),
CONSTRAINT `passenger_reservation_reservationId`
FOREIGN KEY (`reservationId`)
REFERENCES `reservation`(`reservationId`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
If i change GenerationType
to GenerationType.IDENTITY
I get error that
javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Field 'reservationId' doesn't have a default value
Error Code: 1364
Call: INSERT INTO dbname.passenger (FIRSTNAME, LASTNAME) VALUES (?, ?)
bind => [2 parameters bound]
Query: InsertObjectQuery(com.project.entity.PassengerEntity@994)
After adding generator
to the entity and changing type to SEQUENCE
I am getting same error
Internal Exception: java.sql.SQLException: Field 'reservationId' doesn't have a default value