我们使用H2,JPA注解,Spring和Hibernate的组合来开发我们的web应用程序。我们在兼容模式下使用H2,使用MODE = Oracle。与H2,JPA注解和Hibernate使用一对多关联问题
我们拥有一个具有与ItSystemAka类的一个一对多的关联如下的ItSystem类:
@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
如果我们有一个带有多个ItSystemAka实例的ItSystem实例,我们试着将ItSystem实例更新到数据库,然后它将失去对所有关联的ItSystemAkas的引用。用H2 Console查看数据库,可以看到 ITSYSTEM_AKA表中相应行的 foregin key(IT_SYSTEM_EDW_ID)被设置为null。
我试过在H2网站上使用Oracle Dialect代替本地H2方言,但它会产生相同的结果。我也尝试使用实际的Oracle数据库而不是H2,在这种情况下,一切似乎都正常工作。
任何想法是什么问题?
任何帮助将不胜感激。
问候, Priyesh
这个工作,但是我们希望能够用一个单向一个一对多的关联。我也不明白为什么对具有单向一对多关联的实体的更新可以与Oracle协同工作,但不能与H2协同工作。问候,Priyesh – Priyesh
首先,如果你试图映射 '@Column(name =“ITSYSTEM_EDW_ID”)' 'private BigDecimal itSystemEdwId; “你试图让你的协会成为双面的。 – Yappie