Hibernate,错误org.hibernate.util.JDBCExceptionReporter字段'Variable_ID'没有默认值

时间:2013-05-18 09:03:09

标签: java hibernate hibernate-mapping

我在将数据从一侧关系插入到其他表格以及同时插入关系的另一侧时遇到问题

我有: 具有用户实体的表用户

@Entity
@Column(name="USER")
public class User{


private int id;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="ID")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }


@ManyToMany
@Cascade(org.hibernate.annotations.CascadeType.ALL)
@JoinTable(name="USER_CARS_JOINTABLE", 
                joinColumns=@JoinColumn(name="USER_ID"),
                inverseJoinColumns=@JoinColumn(name="CARS_ID"))
public Cars userCars;

//set and get methods omitted

}

表CARS与汽车实体

@Entity
   @Column(name="CARS")
   public class Cars{

    private int dateId;

    @Id
    @GeneratedValue(strategy=IDENTITY)
    @Column(name="DATE_ID")
    public int getDateId() {
        return dateId;
    }

    public void setDateId(int dateId) {
        this.dateId = dateId;
    }


   @ManyToMany
   @Cascade(org.hibernate.annotations.CascadeType.ALL)
   @JoinTable(name="USER_CARS_JOINTABLE", 
               joinColumns=@JoinColumn(name="CARS_ID"),
               inverseJoinColumns=@JoinColumn(name="USER_ID"))

   public User username;

   //set and get methods omitted

   }

正如您所看到的,我在USER和CARS之间有一个JoinTable“USER_CARS_JOINTABLE”,其中包含用户和汽车表上的FK。

我还将表DESCRIPTION和Entity类的名称描述为:

@Entity
  @Column(name="DESCRIPTION")
  public class Description{

  private int id;

    @Id
    @GeneratedValue(strategy=IDENTITY)
    @Column(name="ID")
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }


  private String color;
  private String size;
  private String speed;
  private String type;

  //set and get methods omitted

  }

我的JoinTable USER_CARS_JOINTABLE是:

  

USER_ID INT NOT NULL,CARS_ID INT NOT NULL,DESCRIPTION_ID INT NOT   NULL,PRIMARY KEY(INSTITUTION_ID,DATE_ID,SRC_ID),CONSTRAINT   FK_USER_ID_IN_USER_CARS FOREIGN KEY(USER_ID)REFERENCES USER(ID),   CONSTRAINT FK_CARS_ID_IN_USER_CARS FOREIGN KEY(CARS_ID)参考   CARS(ID),CONSTRAINT FK_DESCRIPTION_ID_IN_USER_CARS FOREIGN   KEY(DESCRIPTION_ID)参考说明(ID)

在我的情况下,用户可以拥有很多汽车,一种类型的汽车可以属于用户数量。同样的车可以有不同的描述。 在类描述和用户实体和汽车实体之间我将有一个Undirectional,JoinTable,OneToMany关系。这意味着类用户和汽车将了解描述类,但描述将不知道用户和汽车。当我尝试将数据从用户端引入我的数据库以及类汽车和类描述时我会有这样的例外:

  

Hibernate:插入USER_CARS_JOINTABLE(User_ID,Description)   values(?,?)错误:org.hibernate.util.JDBCExceptionReporter - 字段   'cars_ID'没有默认值ERROR:   org.hibernate.event.def.AbstractFlushingEventListe ner - 不能   将数据库状态与会话同步

如果我从汽车方面这样做,我会有这样的错误:

  

Hibernate:插入USER_CARS_JOINTABLE(Cars_ID,描述)   values(?,?)错误:org.hibernate.util.JDBCExceptionReporter - 字段   'User_ID'没有默认值ERROR:   org.hibernate.event.def.AbstractFlushingEventListe ner - 不能   将数据库状态与会话同步

这意味着我的一些外键,一个JoinTable USER_CARS_JOINTABLE没有得到一个ID,因为我从侧面插入它是无法生成或插入数据到这个连接表USER_CARS_JOINTABLE,我不知道为什么?

如果我要为我的某些外键(例如User_ID或Cars_ID)添加我的JoinTable数据库模式DEFAULT“数字”而不是它的工作,它是inser数据,但它总是会插入相同的数字,我输入的DEFAULT “数”。 但我想要的是,在joinTable USER_CARS_JOINTABLE中为我的一个问题外键提供与parient表User或Cars相同的值!也许我可以在我的Entity类中使用Hibernate中的一些@Generator注释作为我的JoinTable。

谢谢。

3 个答案:

答案 0 :(得分:0)

您的映射是错误的。双向关联始终具有所有者方和反方。你让双方成为了主人。反面不得包含映射信息(连接表,连接列),并且必须使用mappedBy属性标记为反面:

@ManyToMany(cascade = CascadeType.ALL, mappedBy = "userCars")
private User username;

请注意,您还有其他几个问题:

  • 命名很糟糕。汽车应该被命名为汽车。用户名应该命名为user。 userCars应该命名为cars。
  • 用户名字段不应该是公开的,而应是私有的
  • 注释应始终位于字段上,或始终位于getter上。您不能混合两种展示位置类型。如果你这样做,Hibernate将忽略其中一半

答案 1 :(得分:0)

首先,您在单个字段上使用ManyToMany。有这样的事情会更好:

User班级中:

@ManyToMany
@Cascade(org.hibernate.annotations.CascadeType.ALL)
@JoinTable(name="USER_CARS_JOINTABLE", 
            joinColumns=@JoinColumn(name="USER_ID"),
            inverseJoinColumns=@JoinColumn(name="CARS_ID"))
public List<Cars> userCars;

Car课程中,最好是用户mappedBy

@ManyToMany(mappedBy = "userCars")
public List<User> usernames;

在这种情况下,您将此关系设置为双向,并避免使用不必要的表(对于此ManyToMany关系,一个表就足够了)

答案 2 :(得分:0)

我认为您的问题是因为您使用策略IDENTITY来生成您的ID。尝试将其设置为AUTO。

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID")