Hibernate Entity Class отображается на две разные таблицы

Я пытаюсь нанести на карту свой @Entity объекты их соответствующих классов, где один является параметром другого.

Проще говоря, у меня есть что-то вроде этого:

@Entity
@Table(name="TableA")
public class ClassA {
    @Id
    private long id;

    private String paramA;

    private ClassB classB;

    // getters and setters here
}

ClassB выглядит так:

@Entity
@Table(name="TableB")
public class ClassB {
    @Id
    private long classAId;

    private String paramB;

    // getters and setters here
}

Чтобы сохранить, я использую интерфейс - (я подозреваю, это или то, как я использую это моя проблема?)

@Transactional
public interface ClassADao extends JpaRepository<ClassA, Integer> {

}

В моей БД все параметры в ClassA отображаются в соответствующую таблицу, за исключением ClassB, у которого есть параметры, которые все соответствуют другой таблице для ClassB. Я новичок в Hibernate и надеялся, что он сопоставит параметры ClassB с правильной таблицей. Однако, похоже, он пытается сопоставить ClassB со столбцом в таблице для ClassA и, таким образом, дает мне эту ошибку:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'classB' in 'field list'
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
    at com.mysql.jdbc.Util.getInstance(Util.java:387)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:941)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3870)

У меня вопрос, есть ли способ (желательно через аннотацию), чтобы сказать Hibernate сделать параметры в ClassB сопоставить его собственной таблице? Я пытался использовать @SecondaryTable, но это не сработало.

Заранее спасибо!

1 ответ

Решение

С помощью людей, которые прокомментировали это, я смог найти следующее решение:

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;

@OneToOne(cascade = {CascadeType.ALL})
@PrimaryKeyJoinColumn
private ClassB classB;

public setClassB(ClassB classB) {
    this.classB = classB;
    this.classB.setClassA(this);
}

И отредактировал ClassB примерно так:

@Entity
@Table(name="TableB")
public class ClassB {
    @MapsId
    @OneToOne
    @JoinColumn
    private ClassA classA

    private String paramB;

    // getters and setters here - including for ClassA

}

Теперь, когда я звоню весной, вводят ClassADao.save(classA), ClassB также корректно сохраняется в БД бесплатно.

Другие вопросы по тегам