2016-06-02 2 views
0

Я пытаюсь сохранить один родительский объект, который соединен с другим дочерним объектом, но проблема в том, что идентификатор не генерируется для этого дочернего элемента, если он сохраняется, поэтому я имею эту ошибку: [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] ORA-01400: cannot insert NULL into ("L2S$OWNER"."SABRI"."TRANSITION_MATRIX_ID")Сохранение 2 таблицы с тем же сгенерированным идентификатором

есть ребенок Entity:

@Data 
@Entity 
@IdClass(MyLibrarySabriEntityPK.class) 
@Table(name = "SABRI", schema = "L2S$OWNER", catalog = "") 

public class MyLibrarySabriEntity extends ActionForm { 
@Access(AccessType.FIELD) 
@Id 
@ManyToOne 
@JoinColumn(name = "TRANSITION_MATRIX_ID", referencedColumnName = "ID_TRANSITION_MATRIX") 
private MyLibraryTestEntity sabriEntity; 

@Id 
private String RATING_ID_ROW; 

@Id 
private String RATING_ID_COL; 


@Basic 
@Column(name = "TRANSITION_PROBABILITY", nullable = true, insertable = true, updatable = true, precision = 20) 
private Double TRANSITION_PROBABILITY;} 

класс PK:

@Data 
public class MyLibrarySabriEntityPK implements Serializable { 
private String TRANSITION_MATRIX_ID; 
private String RATING_ID_ROW; 
private String RATING_ID_COL; 


public MyLibrarySabriEntityPK(String TRANSITION_MATRIX_ID,String RATING_ID_COL,String RATING_ID_ROW){ 
    this.TRANSITION_MATRIX_ID=TRANSITION_MATRIX_ID; 
    this.RATING_ID_COL = RATING_ID_COL; 
    this.RATING_ID_ROW= RATING_ID_ROW; 
} 

}

есть родительский объект:

@Data 
@Entity 
@Table(name = "TEST", schema = "L2S$OWNER", catalog = "") 
public class MyLibraryTestEntity extends ActionForm { 

    @Access(AccessType.FIELD) 
    @OneToMany(mappedBy = "sabriEntity", cascade = CascadeType.PERSIST) 
    private final List<MyLibrarySabriEntity> entities = new ArrayList<MyLibrarySabriEntity>(25); 

    public void addEntitysabri(MyLibrarySabriEntity entity) { 
     getEntities().add(entity); 
     entity.setSabriEntity(this); 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "IdGenerated") 
    @GenericGenerator(name = "IdGenerated", strategy = "dao.Identifier") 
    @Column(name = "ID_TRANSITION_MATRIX", nullable = false, insertable = false, updatable = false, length = 10) 
    private String ID_TRANSITION_MATRIX; 


    @Basic 
    @Column(name = "REFERENCE", nullable = true, insertable = true, updatable = true, precision = 0) 
    private Integer reference;} 

И здесь я стараюсь оставаться в родительской таблице, которая, как предполагается, сохранится и в дочерней таблице, но не генерируется!

MyLibrarySabriEntity Entity = null; 
MyLibraryTestEntity test = getMyLibraryTestEntity(matrixStartDate, matrixName); // here I get the values of my entity test (parent) 
    try { 
     transaction.begin(); 
     for (int row = 0; row < 20; row++) { 
      for (int col = 0; col < 20; col++) { 
       double val = cells.get(row + FIRST_ROW, col + FIRST_COL).getDoubleValue(); 
       Entity = getMyLibrarySabriEntity(col, row, val); // this get the values of the Entity parameters (child) 
       Entity.setSabriEntity(test); 
       test.addEntitysabri(Entity); 
       em.persist(test); 
      } 
     } 


    } catch (Exception e) { 
     if (transaction.isActive()) 
      transaction.rollback(); 
     LOGGER.warn(e.getMessage(), e); 

    } finally { 
     if (transaction.isActive()) 
      transaction.commit(); 
     em.close(); 

    } 
+0

выглядит так: не настройте зависимые компоненты, проверьте еще раз. –

+0

Почему заголовок говорит «тот же сгенерированный идентификатор»? У дочернего объекта «MyLibraryTestEntity» wlll есть свой собственный идентификатор, а родительский объект будет иметь свой собственный, если вы правильно настроите зависимость beans. – Prashant

+0

MyLibraryTestEntity это родительский объект, а дочерний объект - MyLibrarySabriEntity, вы правы, это не тот же идентификатор, потому что у дочернего id есть 3 id, поэтому я имею в виду, что значение сгенерированного идентификатора родительского объекта будет одинаковым для значения column TRANSITION_MATRIX_ID моего дочернего объекта – sabri

ответ

0

Предполагая, что вы используете JPA 2.0+

Удалить это отображение полностью:

@Id 
@Column(name = "TRANSITION_MATRIX_ID", nullable = false, 
     insertable = true, updatable = true, length = 100) 
private String TRANSITION_MATRIX_ID; 

и поставить @Id непосредственно на ManyToOne и удалить Вставные и обновляемые атрибуты.

@Access(AccessType.FIELD) 
@Id 
@ManyToOne 
@JoinColumn(name = "TRANSITION_MATRIX_ID", referencedColumnName = "ID_TRANSITION_MATRIX") 
private MyLibraryTestEntity sabriEntity; 

Обновите свой идентификационный класс соответствующим образом. Любая предыдущая ссылка на TRANSITION_MATRIX_ID должна быть заменена ссылкой на sabriEntity. Вы также путаете @EmbeddedId и @IdClass: только первые будут содержать определения столбцов, тогда как вы используете последний подход.

public class MyLibrarySabriEntityPK implements Serializable { 

    private String sabriEntity; 
    private String RATING_ID_ROW; 
    private String RATING_ID_COL; 
} 

См:

https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#JPA_2.0

+0

Я сделал это, но у меня есть эта ошибка: «Не удалось найти свойства (TRANSITION_MATRIX_ID) в объекте, аннотированном с помощью @IdClass: model.MyLibrarySabriEntity», и проблема в том, что я не могу удалить его, потому что у меня есть 3 столбец как идентификатор не только 2! – sabri

+0

Свойство в классе ID должно соответствовать свойству в Entity, поэтому это будет 'sabriEntity', а не' TRANSITION_MATRIX_ID' –

+0

Я попытался удалить его, но у меня была такая же ошибка "не может вставить NULL в (" L2S $ OWNER ". «SABRI». «TRANSITION_MATRIX_ID») ». – sabri

0

Спасибо, чтобы Алан Хей, я нашел эту проблему, изменить свойство TRANSITION_MATRIX_ID моих IDclass в sabriEntity и я удалить все аннотацию этого класса!

дочерней сущности

@Data 
@Entity 
@IdClass(MyLibrarySabriEntityPK.class) 
@Table(name = "SABRI", schema = "L2S$OWNER", catalog = "") 
public class MyLibrarySabriEntity extends ActionForm { 

@Access(AccessType.FIELD) 
@ManyToOne 
@Id 
@JoinColumn(name = "TRANSITION_MATRIX_ID", referencedColumnName = "ID_TRANSITION_MATRIX") 
private MyLibraryTestEntity sabriEntity; 


@Id 
private String RATING_ID_ROW; 

@Id 
private String RATING_ID_COL; 


@Basic 
@Column(name = "TRANSITION_PROBABILITY", nullable = true, insertable = true, updatable = true, precision = 20) 
private Double TRANSITION_PROBABILITY; 

родительский объект

@Data 
@Entity 
@Table(name = "TEST", schema = "L2S$OWNER", catalog = "") 
public class MyLibraryTestEntity extends ActionForm { 

@Access(AccessType.FIELD) 
@OneToMany(mappedBy = "sabriEntity", cascade = CascadeType.PERSIST) 
private final List<MyLibrarySabriEntity> entities = new ArrayList<MyLibrarySabriEntity>(25); 

public void addEntitysabri(MyLibrarySabriEntity entity) { 
    getEntities().add(entity); 
    entity.setSabriEntity(this); 
} 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO, generator = "IdGenerated") 
@GenericGenerator(name = "IdGenerated", strategy = "dao.Identifier") 
@Column(name = "ID_TRANSITION_MATRIX", nullable = false, insertable = false, updatable = false, length = 10) 
private String ID_TRANSITION_MATRIX; 


@Basic 
@Column(name = "REFERENCE", nullable = true, insertable = true, updatable = true, precision = 0) 
private Integer reference; 

ПК Класс

@Data 
public class MyLibrarySabriEntityPK implements Serializable { 
private MyLibraryTestEntity sabriEntity; 
private String RATING_ID_ROW; 
private String RATING_ID_COL; 

public MyLibrarySabriEntityPK() { 
} 

public MyLibrarySabriEntityPK(MyLibraryTestEntity sabriEntity,String RATING_ID_COL,String RATING_ID_ROW){ 
this.sabriEntity=sabriEntity; 
this.RATING_ID_COL = RATING_ID_COL; 
this.RATING_ID_ROW= RATING_ID_ROW; 

}

}

Смежные вопросы