2013-05-18 69 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