@ Индекс не работает на подклассах JOINED? - PullRequest
2 голосов
/ 15 февраля 2012

Мои аннотации 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

1 Ответ

1 голос
/ 10 августа 2012

Добавить эту аннотацию на

@AttributeOverride(name="id", column=@Column(name="base_batch_id"))
private BaseBatch baseBatch;
...