Мои аннотации Hibernate работают, когда мое приложение работает на сервере, но когда я пытаюсь протестировать свои классы Hibernate с помощью JUnit, я получаю следующую ошибку:
org.hibernate.MappingException: Unable to find column with logical name base_batch_id in table T_BASE_EXT
at org.hibernate.cfg.Configuration$MappingsImpl.getPhysicalColumnName(Configuration.java:3550)
at org.hibernate.cfg.IndexOrUniqueKeySecondPass.addConstraintToColumn(IndexOrUniqueKeySecondPass.java:87)
at org.hibernate.cfg.IndexOrUniqueKeySecondPass.doSecondPass(IndexOrUniqueKeySecondPass.java:77)
at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1716)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1423)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1856)
at foo.BaseTest.setUp(BaseTest.java:31)
at junit.framework.TestCase.runBare(TestCase.java:125)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Я считаю, что это как-то связано с аннотацией @Index
в классе BaseExt
. Мои аннотированные классы работают и не могут их изменить, но могу ли я что-то сделать с моей конфигурацией Hibernate в тесте JUnit, чтобы это заработало?
Я нашел билет с похожей проблемой: https://hibernate.onjira.com/browse/ANN-207
Вот тест JUnit для репликации этой ошибки:
Абстрактный базовый класс:
@MappedSuperclass
public abstract class Base implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name = "SEQ_GEN", sequenceName = "SEQ", initialValue = 1)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_GEN")
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
Класс, расширяющий абстрактный класс:
А также имеет отношение ManyToOne к BaseBatch-классу
@Entity
@Table(name = "T_BASE_EXT")
@org.hibernate.annotations.Table(appliesTo = "T_BASE_EXT", indexes = {
@Index(name = "IDX_CDA_1", columnNames = {"BASE_BATCH_ID"})
})
public class BaseExt extends Base implements java.io.Serializable {
private static final long serialVersionUID = 1L;
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@ForeignKey(name = "CDA_BASE_BATCH_FK")
private BaseBatch baseBatch;
public BaseBatch getBaseBatch() {
return baseBatch;
}
public void setBaseBatch(BaseBatch baseBatch) {
this.baseBatch = baseBatch;
}
}
BaseBatch:
@Entity
@Table(name = "T_BASE_BATCH")
public class BaseBatch extends Base implements java.io.Serializable {
private static final long serialVersionUID = 1L;
}
Тест JUnit:
public class BaseTest extends TestCase {
private SessionFactory sessionFactory = null;
@Override
protected void setUp() throws Exception {
super.setUp();
final String driverClass = "org.hsqldb.jdbcDriver";
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Configuration cfg = new Configuration()
.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect")
.setProperty("hibernate.connection.driver_class", driverClass)
.setProperty("hibernate.connection.url", "jdbc:hsqldb:mem:basetest")
.setProperty("hibernate.hbm2ddl.auto", "create");
cfg.addAnnotatedClass(Base.class);
cfg.addAnnotatedClass(BaseExt.class);
cfg.addAnnotatedClass(BaseBatch.class);
sessionFactory = cfg.buildSessionFactory();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
sessionFactory.close();
}
public void testBase() {
sessionFactory.openSession();
assertTrue(true);
}
}
Я использую аннотации Hibernate 3.2.0.Final и Hibernate 3.6.9.Final