LINUX.ORG.RU

hibernate не сохраняет child'ов

 , ,


0

1

Родительская сущность:

@Entity
@Table(name = "COCERTIFICATES")
public class COCertificatesEntity implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cocertgen")
    @SequenceGenerator(name = "cocertgen", sequenceName = "SEQ_COMMON")
    @Column(name = "CERT_ID", nullable = false, insertable = true, updatable = true, precision = 0)
    private Integer IdCOCertificate;

    @OneToMany(mappedBy = "certificate", fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE })
    private List<COCertificateOperationsEntity> operations;
    // ...
}
Child-сущность:
@Entity
@Table(name = "COCERTIFICATE_OPERATIONS")
public class COCertificateOperationsEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cocertoperationgen")
    @SequenceGenerator(name = "cocertoperationgen", sequenceName = "SEQ_COCERT_OPERATION")
    @Column(name = "TRANSACTION_ID", nullable = false, insertable = true, updatable = true, precision = 0)
    private Long transactionId;

    @ManyToOne(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE })
    @JoinColumn(name = "CERT_ID")
    private COCertificatesEntity certificate;
    // ....
}

Наполнение сущностей:

    // ...
    COCertificatesEntity certificateEntity = new COCertificatesEntity();
    // ... 
    if (!currencyOperations.isEmpty()) {
            for (CurrencyOperationRequest operation : currencyOperations) {
                COCertificateOperationsEntity operationEntity = operationToEntity(operation);
                operationEntity.setCertificate(certificateEntity);
                certificateEntity.addOperation(operationEntity);
            }
    }
    // ...

здесь не обязательно ребенку задавать ссылку на родителя, но т.к. не работает, попробовал.

DAO-интерфейс:

public interface COCertificateDAO {
    @Transactional(Transactional.TxType.REQUIRED)
    void save(COCertificatesEntity entity);
}
в имплементации выполняется sessionFactory.getCurrentSession().persist(entity);

Кусочек настройки SessionFactory:

    <!-- ... -->
    <tx:annotation-driven transaction-manager="transactionManager" />

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <!-- ... -->
    </bean>
    <!-- ... -->

а так же application.yml, без которого, к слову, связка с хибернейтом не заводилась совершенно никак. Привет, spring-boot:

spring:
  datasource:
    continueOnError: true
    initialize: false
    initialSize: 0
    timeBetweenEvictionRunsMillis: 5000
    minEvictableIdleTimeMillis: 5000
    minIdle: 0
    driverClassName: oracle.jdbc.OracleDriver

  jpa:
    show-sql: true
    hibernate:
      ddl-auto: none
      naming_strategy: org.hibernate.cfg.DefaultNamingStrategy
    properties:
      hibernate:
        dialect: org.hibernate.dialect.Oracle10gDialect
        hbm2ddl:
          auto: none
        temp:
          use_jdbc_metadata_defaults: false
При попытке сохранения предок оказывается в таблице, child'ов нет. В логах тоже ничего. Вопрос - ЧЯДНТ? Обычно, работало (неужели гадостливый spring-boot? «не верю» (с))

★★

Последнее исправление: bytecode (всего исправлений: 3)
Ответ на: комментарий от Deleted

Внезапно, помог хибернейтовский @Cascade(CascadeType.ALL). И как-то мне это решение кажется странным. Точнее даже не так, мне кажется слегка странным, что без этой аннотации не работает.

bytecode ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.