【问题标题】:EntityManager persist multiple relationshipEntityManager 持久化多重关系
【发布时间】:2018-07-16 07:12:32
【问题描述】:

我有 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

【问题讨论】:

  • 您使用的是什么关系型数据库? ID 列是如何定义的?
  • 请不要更改问题,使其成为不同的问题,尤其是当它有答案时。这会使答案变得荒谬。我回滚了你的更改。请改为创建一个新问题,如果其中一个答案有助于解决此问题,请支持它,如果它解决了问题,请接受它为正确的,这样其他人就有更好的机会找到问题的有用和正确答案。
  • 你能不能尝试改变“private int id;”到“私有整数 id;”

标签: spring-boot spring-data-jpa


【解决方案1】:

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

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

显而易见的解决办法是改变这一点。

【讨论】:

  • 我已经通过为实体添加“实现可序列化”来修复,但我仍然遇到错误,并且我在帖子中有更新错误。
  • 我认为我为 auto 设置 id 的问题增加了,所以孩子们不能没有 parent 的 id。
【解决方案2】:

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

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

【讨论】:

  • 我已经通过为实体添加“实现可序列化”来修复,但我仍然遇到错误,并且我在帖子中有更新错误。
猜你喜欢
  • 2017-01-10
  • 2011-11-28
  • 1970-01-01
  • 2011-03-24
  • 2016-10-04
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多