簡體   English   中英

一對多的休眠外鍵約束問題

[英]Hibernate Foreign Key Constraint issue for many to one

首先,讓我說,我知道這是外鍵的另一個“休眠”問題。 但是,我在這里找到的所有解決方案似乎都不適合我。 所以我在這里尋求幫助。

數據庫
這是父表

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的觸發器存在問題。

感謝您對此的任何幫助或指導。 謝謝!

我想通了。 問題出在IDS上的觸發器和SequenceGenerators上。 它本質上是生成2個IDS ...一個來自觸發器,另一個來自Hibernate。 當Hibernate需要Hibernate中的一個時,它試圖使用Trigger中的一個。

我只是禁用了觸發器,但效果很好:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM