Java Hibernate,错误org.Hibernate.util.jdbceptionReporter字段';变量ID';不';没有默认值

Java Hibernate,错误org.Hibernate.util.jdbceptionReporter字段';变量ID';不';没有默认值,java,hibernate,hibernate-mapping,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;

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

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

@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与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\u CARS\u JoinTable”,其中包含用户和车辆表上的FK

我还将有表说明和实体类名称说明:

@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用户\u CARS\u JoinTable是:

用户ID INT不为空,汽车ID INT不为空,说明ID INT不为空 NULL,主键(机构ID、日期ID、SRC ID),约束 FK_USER_ID_IN_USER_CARS外键(USER_ID)引用用户(ID), 约束FK_CARS_ID_IN_USER_CARS外键(CARS_ID)引用 车辆(ID),约束FK\u描述\u用户\u车辆中的ID\u 密钥(描述\u ID)引用描述(ID)

在我的例子中,用户可以有很多车,一种类型的车可以属于多个用户。同样的汽车也可以有不同的描述。 在类描述和用户实体以及汽车实体之间,我将有一个无向的、可连接的、一对一的关系。这意味着类用户和汽车将知道描述类,但描述将不知道用户和汽车。当我试图将数据从用户端收集到我的数据库中,然后将数据添加到类别汽车和类别描述中时,我会遇到如下异常:

Hibernate:插入用户\u CARS\u JOINTABLE(用户\u ID,说明) 值(?,)错误:org.hibernate.util.jdbceptionReporter-字段 “Cars_ID”没有默认值错误: org.hibernate.event.def.AbstractFlushingeVentLister-ner-无法 将数据库状态与会话同步

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

休眠:插入到用户\u CARS\u连接表(CARS\u ID,Description) 值(?,)错误:org.hibernate.util.jdbceptionReporter-字段 “用户ID”没有默认值错误: org.hibernate.event.def.AbstractFlushingeVentLister-ner-无法 将数据库状态与会话同步

这意味着我的一些外键一个可连接的用户\u CARS\u JoinTable没有得到一个ID,因为我从不能生成或插入数据到这个可连接的用户\u CARS\u JoinTable的一侧插入它,我不知道为什么

如果我为我的一些外键(如User\u ID或Cars\u ID)向JoinTable数据库模式中添加默认的“number”,那么它是插入数据,但默认情况下,它总是插入与我输入的“number”相同的数字。 但是我想要的是,为我的一个问题,在joinTable USER\u CARS\u joinTable中的外键提供与parent table USER或CARS中相同的值!!!也许我可以使用Hibernate中的@Generator注释来表示实体类中的JoinTable


谢谢。

您的映射错误。双向关联始终具有所有者侧和反向侧。你让双方都成为拥有者。反向侧不能包含映射信息(联接表、联接列),必须使用
mappedBy
属性将其标记为反向侧:

@ManyToMany(cascade = CascadeType.ALL, mappedBy = "userCars")
private User username;
请注意,该代码还有几个其他问题:

  • 命名不好。汽车应该被命名为汽车。用户名应为命名用户。userCars应该命名为cars
  • 用户名字段不应为公共字段,而应为私有字段
  • 注释应该始终位于字段上,或者始终位于getter上。不能同时使用这两种放置类型。如果这样做,其中一半将被Hibernate忽略

首先,您在单个字段上使用了
manytomy
。最好有这样的东西:

在您的
用户
课程中:

@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;

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

我相信您的问题是因为您正在使用策略标识生成ID。尝试将此设置为自动

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

如何为每个实体类定义ID?我没有看到上面列出的任何内容。很抱歉,我更改了它。还要添加我的JoinTAble的description。。谢谢你谢谢你。。。但我想从车侧获取数据,只是想知道哪辆车属于用户,或者向用户插入数据并从车侧进行描述,这对我有用吗?是的。如果您总是修改所有者端,而不仅仅是关联的反向端。请稍候。日志消息显示:
insert into USER\u CARS\u JOINTABLE(USER\u ID,Description)
。这个描述栏是什么?它在用户和汽车之间的连接表中做什么?您没有使用具有第三列的同一联接表来保存user和description之间的关联,是吗?如果是这样,请不要。是的,先生。我使用JoinTable绑定用户表、Car表和描述表。我使用这个连接表只是为了方便。我想从用户端在描述表和汽车中插入数据,从用户端和汽车端提取数据。Description是我存储汽车描述的表格。用户和描述之间的无向一域以及汽车和描述之间的无向一域。例如,我想从描述表中提取与用户标识1汽车标识3描述标识5或汽车标识3用户标识20描述标识10相关的数据。这就是为什么我选择2将描述FK放在我的联接表中。如果描述是一个汽车的描述,你应该在汽车和描述之间有关联,而不是在用户和描述之间。如果在Car和Description之间使用OneToMany单向关联,那么它应该使用另一个联接表。联接表联接2个实体/表。不是3。谢谢你,先生。是的,你是对的,我也这么说,我同意你们两个。但这并没有改变我的错误。但我的错误是可以原谅的。你能帮我解决我的问题吗?我有upd
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID")