2013-05-18 49 views
0

我有问题,插入数据从一个侧面关系到其他表和关系的另一边,同时休眠,错误org.hibernate.util.JDBCExceptionReporter场“Variable_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", 
       [email protected](name="USER_ID"), 
       [email protected](name="CARS_ID")) 
public Cars userCars; 

//set and get methods omitted 

} 

表汽车行驶汽车实体

@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", 
       [email protected](name="CARS_ID"), 
       [email protected](name="USER_ID")) 

    public User username; 

    //set and get methods omitted 

    } 

正如你可以看到我有一个乔USER和CARS之间的用户和汽车表中包含FK的inTable“USER_CARS_JOINTABLE”。

我也将有表说明和实体类名称描述:

@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) REFERENCES CARS(ID), CONSTRAINT FK_DESCRIPTION_ID_IN_USER_CARS FOREIGN KEY(DESCRIPTION_ID) REFERENCES DESCRIPTION(ID)

在我的情况下用户可以拥有汽车的很多的,一个类型的汽车可以属于用户数量。同样的车可以有不同的描述。 类之间的描述和用户实体和汽车实体我将有一个Undirectional,JoinTable,OneToMany的关系。这意味着类用户和汽车将知道关于描述类,但描述不知道用户和汽车。当我将尝试enset数据,我到中高级轿车和类说明数据库从用户身边,我都会有这样的例外:

Hibernate: insert into USER_CARS_JOINTABLE (User_ID, Description) values (?, ?) ERROR: org.hibernate.util.JDBCExceptionReporter - Field 'Cars_ID' doesn't have a default value ERROR: org.hibernate.event.def.AbstractFlushingEventListe ner - Could not synchronize database state with session

如果我将做到这一点从汽车侧面,我将有一个这样的错误:

Hibernate: insert into USER_CARS_JOINTABLE (Cars_ID, Description) values (?, ?) ERROR: org.hibernate.util.JDBCExceptionReporter - Field 'User_ID' doesn't have a default value ERROR: org.hibernate.event.def.AbstractFlushingEventListe ner - Could not synchronize database state with session

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

如果我将为我的一些外键(如User_ID或Cars_ID)添加我的JoinTable数据库模式,那么DEFAULT“number”比它的工作原理是inser数据,但它总是会插入相同的数字,在“数字”中。 但我想要的是给我的一个问题外键在joinTable USER_CARS_JOINTABLE中的值与在parient表User或Cars中的值相同!也许我可以在我的Entity类中使用一些来自Hibernate的@Generator批注来作为我的JoinTable。

谢谢。

+0

你是如何定义每个实体类的ID的?我没有看到上面列出的任何东西。 – JamesB

+0

我很抱歉,我改变它。还要添加我的JoinTAble的描述。谢谢 – user1798755

回答

0

你的映射是错误的。双向关联总是拥有所有者方和反方。你让双方都是主人。反方不得包含映射信息(连接表,加入列),并且必须使用mappedBy属性被标记为反方:

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

请注意,您有其他几个问题的代码:

  • 命名不好。汽车应该被命名为汽车。用户名应该是用户名。 userCars应该被命名为汽车。
  • 用户名字段不应该是公开的,但私人的
  • 注释应始终在字段上,或始终在getters上。您不能混用两种展示位置类型。如果这样做,其中一半将被休眠忽略
+0

谢谢JB Nizet ...但是我想从Car侧获取数据,只是想知道Car属于哪个用户或将数据插入到Car侧的用户和描述它会为我工作吗? – user1798755

+0

是的。如果您始终修改所有者方面,而不仅仅是协会的反面。 –

+0

我也做过你说的话,并且有这个错误。 – user1798755

0

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

在你User类:

@ManyToMany 
@Cascade(org.hibernate.annotations.CascadeType.ALL) 
@JoinTable(name="USER_CARS_JOINTABLE", 
      [email protected](name="USER_ID"), 
      [email protected](name="CARS_ID")) 
public List<Cars> userCars; 

而在你Car类,最好是用户mappedBy

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

在这种情况下,你在做这个双向关系,并避免不必要的表格(对此ManyToMany关系,一张表就足够了)

+0

谢谢先生。 YEah和JB Nizet一样也是这样说的,我同意你们两人的观点。但这并没有改变我的错误。但是,我的错误是可以接受的。你能帮我解决我的问题吗? – user1798755

+0

我已经更新了我的答案。尝试删除'CascadeType.ALL'来回,'Car'类并再试一次。在这种情况下,如果您先将Car实例保存到数据库中,则不会再发生问题。 –

0

我相信你的问题是因为你正在使用策略IDENTITY来生成你的ID。尝试将其设置为AUTO。

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

此问题的任何更新@ user1798755 – JamesB