繁体   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