簡體   English   中英

如何在Java Hibernate中將外鍵設置為主鍵

[英]How to set the foreign key as a primary key in java hibernate

我正在使用java和hibernate批注定義數據庫模式,並希望在一個表中指定外鍵作為主鍵。

設置此功能時出現錯誤,並認為這可能取決於我如何將外鍵設置為主鍵,因為當我使用普通的主鍵時,不會出現錯誤。

將外鍵設置為主鍵的正確方法是什么?

我當前的代碼設置是:

@Table(name="BATCH_STEP_EXECUTION_CONTEXT")
public class BatchStepExecutionContext implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JoinColumn(name = "STEP_EXECUTION_ID" , columnDefinition="BIGINT NOT NULL", referencedColumnName="STEP_EXECUTION_ID")
    @ForeignKey(name="STEP_EXEC_CTX_FK ")
    @IndexColumn(name="IDX_STEP_EXEC_CTX")  
    private BatchStepExecution batchStepExecution;

批處理步驟執行表將其引用為:

// bi-directional many-to-one association to Batch Step Execution Context
@OneToMany(mappedBy = "batchStepExecution", cascade = {CascadeType.ALL})
private List<BatchStepExecutionContext> batchStepExecutionContext; 

我在嘗試運行代碼時遇到的錯誤是:

Unable to read the mapped by attribute for batchStepExecutionContext in com.ccs.nbook.domain.model.BatchStepExecutionContext!

我要在Java代碼中建模的表是:

CREATE TABLE BATCH_STEP_EXECUTION
    (
    STEP_EXECUTION_ID  BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (MAXVALUE 9223372036854775807),
    VERSION            BIGINT NOT NULL,
    STEP_NAME          VARCHAR (100) NOT NULL,
    JOB_EXECUTION_ID   BIGINT NOT NULL,
    STATUS             VARCHAR (10),
    COUNT              BIGINT,
    CONSTRAINT JOB_EXEC_STEP_FK FOREIGN KEY (JOB_EXECUTION_ID) REFERENCES BATCH_JOB_EXECUTION (JOB_EXECUTION_ID),
    PRIMARY KEY (STEP_EXECUTION_ID)
    )
    ;


CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT
    (
    STEP_EXECUTION_ID  BIGINT NOT NULL,
    SHORT_CONTEXT      VARCHAR (2500) NOT NULL,
    SERIALIZED_CONTEXT LONG VARCHAR,
    PRIMARY KEY (STEP_EXECUTION_ID),
    CONSTRAINT STEP_EXEC_CTX_FK FOREIGN KEY (STEP_EXECUTION_ID) REFERENCES BATCH_STEP_EXECUTION (STEP_EXECUTION_ID)
    )
    ;

因此,我試圖對兩個表之間的STEP_EXECUTION_ID關系進行建模,其中它是BATCH_STEP_EXECUTION中的主鍵,並且是BATCH_STEP_EXECUTION_CONTEXT中的主鍵和外鍵

不太確定您的意思是

想要在一個表中指定外鍵作為主鍵。

不清楚您的意思是什么...這個外鍵已經是主鍵了,對吧?


無論如何,要知道發生了什么(不僅在這種情況下),請閱讀Exception

原因:org.hibernate.MappingException: 無法讀取com.domain.model.BatchJobExecutionContext中batchJobExecutionContext的按屬性映射

它說: BatchJobExecutionContext中缺少一個mapbyby!

如何解決?
通過一個簡單的示例閱讀此答案

@Entity
public class Company {
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "company")
    private List<Branch> branches;
}

@Entity
public class Branch {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "companyId")
    private Company company;
}

我可以看到你缺少@ManyToOne關系的側@OneToMany和它mappedby屬性。 只要您使用過: @OneToMany(mappedBy = "batchStepExecution", cascade = {CascadeType.ALL})您就必須在另一側添加@ManyToOne注釋。 因此,您的代碼需要像這樣:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "STEP_EXECUTION_ID" , columnDefinition="BIGINT NOT NULL", referencedColumnName="STEP_EXECUTION_ID")
@ForeignKey(name="STEP_EXEC_CTX_FK ")
@IndexColumn(name="IDX_STEP_EXEC_CTX")  
private BatchStepExecution batchStepExecution;

筆記:

暫無
暫無

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

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