【问题标题】:Hibernate using a foreign key as part of a composite key使用外键作为复合键的一部分进行休眠
【发布时间】:2015-11-12 21:14:54
【问题描述】:

好的,所以我在 Oracle DB 上有 2 个表,我想用 Spring 3 和 Hibernate 3 在 Java 中表示它们。它们具有多对一关系,并且这些表类似于

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

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

因为 Options 表只对 Car 有意义,所以我们只关心在访问 Car 时访问它,因此它没有自己的唯一 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

我做错了什么?

【问题讨论】:

    标签: java hibernate foreign-keys composite-key


    【解决方案1】:

    首先,由于 Option 本身不存在,所以它不应该是实体。只有 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
     }
    

    这应该可以解决你所有的问题。

    【讨论】:

    • 如果这解决了您的问题,请接受它作为答案。
    【解决方案2】:

    在定义级联类型时,您在上面的代码中确实有错字:

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

    这可能会导致您的列索引无效。

    【讨论】:

    • 我抄写的时候只是一个错字。不过,感谢您指出这一点。我现在改正了那个错字。
    猜你喜欢
    • 2015-12-14
    • 2015-08-20
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多