2016-11-24 5 views
0

Я использую Spring Boot 1.3.1.RELEASE с Hibernate и H2 для тестов интеграции. Ниже приведены мои отношения с однонаправленным отношением OneToMany. По какой-то причине сгенерированный внешний ключ DDL не содержит ON DELETE CASCADE. В соответствии с H2 documentation поддерживаются ссылочные действия. Я попробовал двунаправленный OneToMany, но ON DELETE CASCADE все еще отсутствует. Пожалуйста, порекомендуйте. Я бы хотел, если это возможно, избегать использования Hibernate. Заранее спасибо.OneToMany не создает внешний ключ с ON DELETE CASCADE на базе H2

Мои объекты:

@MappedSuperclass 
public abstract class DomainObjectLong implements Persistable<Long> { 
    @Id 
    @GenericGenerator(name="ID_GEN" , strategy="increment") 
    @GeneratedValue(generator = "ID_GEN") 
    private Long id; 

    @Override 
    @Transient 
    public boolean isNew() { 
     return id == null; 
    } 
} 


@Entity 
@Table(name = "event") 
public class EventVO extends DomainObjectLong { 
    @Column(name = "time", nullable = false, updatable = false) 
    private LocalDateTime time = LocalDateTime.now(); 

    @Column(name = "type", nullable = false, updatable = false) 
    @Enumerated(STRING) 
    private EventType type; 

    @OneToMany(cascade = ALL, fetch = EAGER, orphanRemoval = true) 
    @JoinColumn(name = "event_id", nullable = false) 
    private List<EventDataVO> data; 
} 


@Entity 
@Table(name = "event_data", uniqueConstraints = { 
     @UniqueConstraint(columnNames = {"event_id", "key"}) 
}) 
public class EventDataVO extends DomainObjectLong { 
    @Column(name = "key", length = 128, nullable = false, updatable = false) 
    private String key; 

    @Column(name = "value", length = 512, nullable = false, updatable = false) 
    private String value; 
} 

Свойства:

datasource.runtime.url=jdbc:h2:mem:runtimetestdb;DB_CLOSE_ON_EXIT=FALSE 
datasource.runtime.driver-class-name=org.h2.Driver 
hibernate.dialect=org.hibernate.dialect.H2Dialect 
hibernate.show_sql=true 
hibernate.format_sql=true 
hibernate.hbm2ddl.auto=create-drop 

Вход:

23:40:44.648 [localhost-startStop-1] DEBUG org.hibernate.SQL - 
    alter table event_data 
     add constraint FK_6xxhltyiilvlk02730x7mu7cu 
     foreign key (event_id) 
     references event 
Hibernate: 
    alter table event_data 
     add constraint FK_6xxhltyiilvlk02730x7mu7cu 
     foreign key (event_id) 
     references event 

ответ

1

JPA не генерирует ON DELETE CASCADE ограничений.

Причина в том, что каскадирование выполняется на уровне JPA с помощью атрибута каскада в сопоставлении отображения toMany или toOne.

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

+0

Спасибо, это имеет смысл. Поэтому, даже если я создаю DDL самостоятельно, я не должен использовать ссылочные действия, такие как ON DELETE CASCADE, чтобы избежать возможной проблемы, описанной в вашем ответе, правильно? – Vojtech

+0

Точно. Пусть Hibernate возьмет под свой контроль –

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

  • Нет связанных вопросов^_^