2015-10-15 115 views
1

我正在使用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

+0

也许这个链接可以是有用的。 http://stackoverflow.com/questions/16287007/hibernate-envers-unable-to-read-the-mapped-by-attribute –

回答

0

不是很确定一个主键和外键你的意思

想要将一个表中的外键指定为主键。

不明确你的意思......这个外键已经是主键了,对吗?


总之,要知道这是怎么回事(不仅是在这种情况下),请阅读Exception

造成的:org.hibernate.MappingException:无法读取映射通过属性为com.domain.model.BatchJobExecutionContext中的batchJobExecutionContext

它说:在BatchJobExecutionContext中有一个映射器丢失!

如何解决?
阅读this answer一个简单的例子:

@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; 
} 

我可以看到你缺少的关系@OneToMany@ManyToOne侧和它的属性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; 

注:

+0

对不起,我粘贴了不正确的错误信息,并在上面纠正了它。我已经更新了代码,以包含我错过的ManyToOne注释,但我遇到了同样的错误。如果我将外键与主键分开,并将主键设置为整数ID,那么它工作正常。只有当我尝试将外键设置为主键时,我才有问题。 – user3165854

+0

正如我刚才告诉你的:**你不能使用任何东西作为外键,如果它不是主键**,那就没有意义了....所以外键**必须是主键 –

+0

我可能误解了。 BatchStepExecution表中的主键是BatchStepExecutionContext表中的外键,我也想将其设置为BatchStepExecutionContext表中的主键。我一直在寻找@PrimaryKeyJoinColumn,但也看到了一些方法,比如将主键策略设置为'foreign',并且想知道这些是否适合我想要做的事情 – user3165854