Eclipselink + JPA неожиданно генерирует столбец идентификатора

Eclipselink сгенерировал оператор создания таблицы следующим образом:

Create Table myTable (ID (255) not null, col1 (255), col2(255), col3(255) PK (ID, col1, col2)  



@Embeddable  
MyPK implements Serializable  
{  
    @OneToOne  
    @Id  
    String col1;  

    @OneToOne  
    @Id   
    String col2;    
...  
}  



@Entity  
MyClass implements Serializable  
{  
   @EmbeddedId  
   MyPK pk;  
   String col1;  
   String col2;  
   String col3;  
...  
}

Как предотвратить создание столбца ID в выражении Create Table? Я спрашиваю, потому что em.persist(MyClass) создает исключение ограничения для ID, являющегося нулевым. Я ожидал, что @EmbeddedId переопределит это и предотвратит создание этого поля.

EDIT
Таблица, которую я пытаюсь создать в коде, выглядит так:

fk - col1  
fk - col2
VarChar  - col3

person user123435234234234    schedule 06.04.2011    source источник


Ответы (1)


Первая проблема заключается в том, что атрибут String не может быть сопоставлением OneToOne. Во-вторых, сопоставление OneToOne нельзя использовать в EmbeddedId. В-третьих, вы не используете аннотацию @Id в EmbeddedId, поскольку Embeddable не может иметь идентификатор.

Самый простой способ сделать это:

@Entity
@IdClass(MyPK.class)  
MyClass implements Serializable  
{  
   @OneToOne
   @Id
   TargetClass rel1;

   @OneToOne
   @Id
   SecondTargetClass rel2

   @Basic
   String col3;  
...  
}

MyPK implements Serializable  
{  
    String rel1;  

    String rel2;    
...  
}  

Если вам действительно нужен Embeddable для класса pk, замените аннотацию @ID на @MapsId и добавьте аннотацию EmbeddedId обратно в MyClass, а аннотацию Embeddable обратно в MyPK.

person Gordon Yorke    schedule 07.04.2011
comment
Спасибо именно то что нужно - person user123435234234234; 07.04.2011