2014-09-18 80 views
1

首先,讓我說,我知道這是尚未「另一個」與外鍵的Hibernate問題。然而,我在這裏找到的解決方案似乎都不適合我。所以我在這裏尋找幫助。休眠外鍵約束問題多對一

數據庫
這是父表

CREATE TABLE FORM (
    FORM_ID NUMBER, 
    NAME  VARCHAR2(40), 
CONSTRAINT form_pk PRIMARY KEY (form_id)); 

這是子表

CREATE TABLE REJECTION (
    REJECTION_ID NUMBER, 
    REASON VARCHAR2(2000), 
    FORM_ID NUMBER, 
CONSTRAINT rej_pk PRIMARY_KEY (rejection_id), 
CONSTRAINT rej_fk1 FOREIGN KEY (form_id) REFERENCE form(form_id)); 

每個表中有插入

之前填充主鍵觸發

個實體對象
這是父實體對象:

@Entity 
@Table(name = "FORM") 
public class Form implements Serializable { 
    @Id 
    @Column(name = "FORM_ID", unique = true, nullable = false) 
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "G1") 
    @SequenceGenerator(name = "G1", sequenceName = "FORM_SEQ") 
    // This uses a trigger to generate the ID 
    private Integer formId; 

    @Column(name="NAME") 
    private String name; 

    @OneToMany(mappedBy = "form") 
    private Set<Rejection> rejections; 

    // getters and setters 
} 

這裏是爲孩子的實體對象:

@Entity 
@Table(name = "REJECTION") 
public class Rejection implements Serializable { 
    @Id 
    @Column(name = "REJECTION_ID", unique = true, nullable = false) 
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "G2") 
    @SequenceGenerator(name = "G2", sequenceName = "REJECTION_SEQ") 
    // This uses a trigger to generate the ID 
    private Integer rejectionId; 

    @Column(name="REASON") 
    private String reason; 

    @ManyToOne 
    @JoinColumn(name="FORM_ID") 
    private Form form; 

    // getters and setters 
} 

的hibernate.cfg.xml

<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 
     <property name="hibernate.connection.url">jdbc:oracle:thin:@someConnection</property> 
     <property name="hibernate.connection.username">pancakes</property> 
     <property name="hibernate.connection.password">syrup</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> 

     <property name="hibernate.current_session_context_class">thread</property> 
     <property name="show_sql">true</property> 
     <property name="format_sql">true</property> 
     <property name="use_sql_comments">false</property> 

     <property name="hibernate.c3p0.min_size">1</property> 
     <property name="hibernate.c3p0.max_size">20</property> 
     <property name="hibernate.c3p0.timeout">3000</property> 
     <property name="hibernate.c3p0.max_statements">50</property> 
     <property name="hibernate.c3p0.idle_test_period">300</property> 
     <property name="hibernate.c3p0.preferredTestQuery">SELECT 1 from DUAL</property> 

     <mapping class="com.entity.Form"></mapping> 
     <mapping class="com.entity.Rejection"></mapping> 
    </session-factory> 
</hibernate-configuration> 

守則
最後,這裏是我使用的代碼片段:

session = HibernateUtil.getSessionFactory().openSession(); 
session.beginTransaction(); 

Form form = new Form(); 
form.setName("Test"); 

session.save(form); 

System.out.println("Form ID: " + form.getFormId()); 

Rejections rej = new Rejection(); 
rej.setReason("Some Reason"); 
rej.setForm(form); 

session.save(rej); 

System.out.println("Rejection ID: " + rej.getRejectionId()); 

session.getTransaction().commit(); 
session.close(); 

的錯誤
我得到的錯誤是:
java.sql.SQLIntegrityConstraintViolationException: ORA-02291: integrity constraint (USER.REJ_FK1) violated - parent key not found

兩者的System.outs實際上會返回一個值。

我在想什麼是生成ID的觸發器的問題。

我非常感謝任何幫助或指導。謝謝!

回答

0

我想通了。問題在於IDS上的觸發器和序列發生器。它本質上是從觸發器中產生2個IDS,一個來自Hibernate。當Hibernate需要Hibernate中的一個時,Hibernate試圖使用Trigger中的那個。

我剛剛禁用觸發器,它工作正常:-)