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
также корректно сохраняется в БД бесплатно.