EntityManager保持多重关系

时间:2018-07-16 07:12:32

标签: spring-boot spring-data-jpa

我有spring boot rest api,我成功保存了1个表,但是当我尝试保存具有2个其他关系的对象时却出现错误:

  

o.h.engine.jdbc.spi.SqlExceptionHelper:SQL错误:1364,SQLState:   HY000       o.h.engine.jdbc.spi.SqlExceptionHelper:字段“ id”没有默认值

这是我的实体和实体管理者的持久性:

@Entity
@Table(name="booking")
public class Booking {  
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id")
    private int id; 
    @Column(name="description")
    private String description;
    @OneToMany(mappedBy="booking",cascade = CascadeType.ALL)
    private List<CategoriesBooking> bookingInfos = new ArrayList<>();

@Entity
@Table(name="category_booking")
public class CategoriesBooking {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id")
    private int id;
    @Column(name = "name")  
    private String name;

    @ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    @JoinColumn(name="booking_id")
    private Booking booking;

    @OneToMany(mappedBy="categoriesBooking",cascade = CascadeType.ALL)  
    private List<OptionsBooking> options = new ArrayList<>();



@Entity
@Table(name="options_booking")
public class OptionsBooking {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id")
    private int id;
    @Column(name="name")
    private String name;    
    @ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    @JoinColumn(name = "catebooking_id")    
    private CategoriesBooking categoriesBooking;

@Transactional
@Repository
public class Services{
    @PersistenceContext
    protected EntityManager entityManager;

    public Services() {     
    }   
    public boolean add(Booking booking){
        try {
            entityManager.persist(booking);
            return true;
        } catch (Exception e) {
            entityManager.getTransaction().rollback();          
        }
        return false;
    }
}

数据:

{description: 'test for persist',
bookingInfos:[{
name:'test1',
options:[{
  name: 'test1-test1'
 }]
}]
}

我更新为使用MySQL

2 个答案:

答案 0 :(得分:2)

GenerationType.AUTO选择适合您数据库的ID生成策略。它实际选择的内容取决于您使用的数据库。但是从错误消息来看,它假定id列是某种IDENTITY字段,该字段在插入时会创建一个唯一值。

似乎您的架构没有以这种方式声明id列。

明显的解决方法是更改​​它。

答案 1 :(得分:0)

有时,即使执行SchemaUpdate,对模型或ORM所做的更改也可能无法准确反映在数据库上。

如果错误实际上似乎缺乏合理的解释,请尝试重新创建数据库(或至少创建一个新数据库),并用SchemaExport进行构架。