簡體   English   中英

使用外鍵作為組合鍵的一部分進行休眠

[英]Hibernate using a foreign key as part of a composite key

好的,所以我想在Oracle DB上有2個表,這些表要用Spring 3和Hibernate 3用Java表示。它們之間具有“多對一”關系,這些表類似於

 CAR
 -------
 CAR_PK
 //... other columns

 OPTION
 ------
 CAR_FK
 OPTION_TEXT
 //... other columns

因為“選項”表僅對汽車有​​意義,所以我們只關心在訪問汽車時對其進行訪問,因此它沒有自己的唯一PK。 此外,每輛車最多可以有1個選件。 因此,我們使用的是CAR_FK和OPTIONS_TEXT的復合ID

Java是這樣的

 public class Car{
    @Id
    @Column(name="CAR_PK")
    @GeneratedValue(strategy = GenerationType.SEQUENCE,  generator="CAR_KEY_SEQ")
    @SequenceGenerator (name="CAR_KEY_SEQ", sequenceName="CAR_KEY_SEQ", allocationSize=1)
    private long carPk; 

    @OneToMany(cascade= CascadeType.ALL, mappedBy="car")
    @JoinColumn(name="CAR_PK")
    private List<Option> options; 

    //... other stuff
 }

 @IdClass(OptionId.class)
 public class Option{

      @Id
      private long carFk; 

      @Id
      private String optionText; 

      @ManyToOne
      @JoinColumn(name="CAR_FK")
      private Car car; 

      //... other stuff
 }


 @Emeddable
 public class OptionId implements Serializable{

      @Column(CAR_FK)
      private long carFk; 
      @Column(OPTION_TEXT)
      private String optionText
      //... other stuff
 }

插入時,我希望為Car對象中的carPk生成的相同鍵插入Option對象中的carFk。 我該怎么辦?

 java.sql.SQLException: Invalid column index

我究竟做錯了什么?

第一件事是,由於期權本身不存在,因此不應成為實體。 只有Car是實體對象,而Option是值對象,因此它不應具有自己的任何ID。

您可以將設計更改為

 @Entity
 public class Car{
    @Id
    @Column(name="CAR_PK")
    @GeneratedValue(strategy = GenerationType.SEQUENCE,  generator="CAR_KEY_SEQ")
    @SequenceGenerator (name="CAR_KEY_SEQ", sequenceName="CAR_KEY_SEQ", allocationSize=1)
    private long carPk; 

    @Embedded
    private List<Option> options; 

    //... other stuff
 }

@Embeddable
public class Option{
      private String optionText; 

      //... other stuff
 }

那應該解決您所有的問題。

在定義級聯類型時,上面的代碼中確實有錯別字:

@OneToMany(cascase= CascadeType.ALL, mappedBy="car")

這可能導致您的無效列索引。

暫無
暫無

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

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