Композитный ПК с JPA в ORACLE дает ошибку ORA-00904 - PullRequest
0 голосов
/ 16 ноября 2018

Мне нужно сопоставить составной PK с JPA в БД Oracle.

Я следовал за другими вопросами SO в связи с этим учебным пособием , но я все еще получаю следующую ошибку:

java.sql.SQLSyntaxErrorException: ORA-00904: "COMPOSITEI0_"."NAME_1": Invalid Identifier (где NAME_1 относится к имени одного из столбцов, являющихся частью PK)

Это моя сущность (реальные имена не упомянуты в целях защиты данных):

  @Entity
@Table(schema = "SCHEMA", name = "TABLE")
public class CompositeIdEntity {

  @Column(name = "NAME1")
  private String name1;

  @Column(name = "NAME2")
  private String name2;

  @Column(name = "NAME3")
  private String name3;



  @EmbeddedId
  CompositePrimaryKeyTableEmbeddable id;


  public CompositePrimaryKeyTableEmbeddable getId() {

    return this.id;
  }

      public void setId(CompositePrimaryKeyTableEmbeddable id) {

        this.id = id;
      }

  // other getters and setters

Мой класс идентификатора @Embeddable:

@Embeddable
public class CompositePrimaryKeyTableEmbeddable implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Column(name="name1")
    private String name1;

    @Column(name="name2")
    private String name2;

    public CompositePrimaryKeyTableEmbeddable() {
        super();
    }

    public CompositePrimaryKeyTableEmbeddable(String name1, String name2) {
        this.name1 = name1;
        this.name2 = name2;
    }

Мой @Repository:

 @Repository
public interface CompositeIdDao extends JpaRepository<CompositeIdEntity, CompositePrimaryKeyTableEmbeddable> {

}

И, наконец, вызов БД, которая возвращает только ноль, потому что этопросто тест, чтобы увидеть, все ли работает вместе:

public CompositeIdEto saveCompositeId() {

    CompositeIdEntity compositeIdEto = new CompositeIdEntity();
    compositeIdEto.setname3("New");
    compositeIdEto.setId(new CompositePrimaryKeyTableEmbeddable("ERR", "ER"));

    this.compositeIdDao.save(compositeIdEto);

    return null;
  }

1 Ответ

0 голосов
/ 16 ноября 2018

Кажется, вы дублируете столбцы name1 и name2, объявляя их один раз
в самой сущности, а затем в встраиваемой.

Похоже, вам нужен только встраиваемый идентификатор и объявление name3 в сущности:

   @Entity
   @Table(schema = "SCHEMA", name = "TABLE")
   public class CompositeIdEntity {

   @EmbeddedId
   CompositePrimaryKeyTableEmbeddable id;

   @Column(name = "NAME3")
   private String name3;
...