Мы используем комбинацию H2, JPA-аннотаций, Spring и Hibernate для разработки нашего веб-приложения. Мы используем H2 в режиме совместимости с MODE = Oracle.
У нас есть класс ItSystem, который имеет связь «один ко многим» с классом ItSystemAka следующим образом:
@Entity
@Table(name="ITSYSTEM")
public class ItSystem implements Serializable {
private static final long serialVersionUID = 1L;
private static final String SEQ_NAME = "SeqName";
private static final String SEQUENCE = "sequence";
@Id
@GeneratedValue(generator = SEQ_NAME)
@GenericGenerator(name = SEQ_NAME,strategy = SEQUENCE, parameters = { @Parameter(name = SEQUENCE, value = "IT_SYSTEM_SEQ") })
@Column(name="ITSYSTEM_EDW_ID")
private BigDecimal itSystemEdwId;
@Column(name="ITSYSTEM_VERSION_ID")
private BigDecimal itSystemVersionId;
@OneToMany(fetch = FetchType.EAGER, cascade={CascadeType.ALL})
@JoinColumn(name="ITSYSTEM_EDW_ID")
private Set<ItsystemAka> itSystemAkas;
.....
}
@Entity
@Table(name="ITSYSTEM_AKA")
public class ItSystemAka implements Serializable {
private static final long serialVersionUID = 1L;
private static final String SEQ_NAME = "SeqName";
private static final String SEQUENCE = "sequence";
@Id
@GeneratedValue(generator = SEQ_NAME)
@GenericGenerator(name = SEQ_NAME,strategy = SEQUENCE, parameters = { @Parameter(name = SEQUENCE, value = "IT_SYSTEM_AKA_SEQ") })
@Column(name="AKA_EDW_ID")
private BigDecimal akaEdwId;
private String aka;
@Column(name="ITSYSTEM_EDW_ID")
private BigDecimal itSystemEdwId;
....
}
Мы используем следующие свойства подключения:
myDataSource.driverClassName=org.h2.Driver
myDataSource.url=jdbc:h2:~/test;MODE=Oracle;DB_CLOSE_DELAY=-1
myDataSource.username=sa
myDataSource.password=
sessionFactory.hibernateProperties[hibernate.dialect]=org.hibernate.dialect.H2Dialect
sessionFactory.hibernateProperties[hibernate.hbm2ddl.auto]=create
sessionFactory.hibernateProperties[hibernate.show_sql]=false
sessionFactory.hibernateProperties[hibernate.connection.autocommit]=false
sessionFactory.hibernateProperties[hibernate.format_sql]=true
Если у нас есть экземпляр ItSystem с несколькими экземплярами ItSystemAka, и мы пытаемся обновить экземпляр ItSystem до базы данных, то он теряет ссылку на все связанные с ним ItSystemAkas. Глядя на базу данных с помощью консоли H2, я вижу, что
ключ foregin (IT_SYSTEM_EDW_ID) для соответствующих строк в
Таблица ITSYSTEM_AKA получает нулевое значение.
Я пытался использовать Oracle Dialect вместо нативного H2 Dialect, как рекомендовано на веб-сайте H2, но он дает те же результаты. Я также попытался использовать реальную базу данных Oracle вместо H2, и в этом случае все работает нормально.
Есть идеи о том, что идет не так?
Любая помощь будет высоко ценится.
С уважением,
Priyesh