我正在尝试将@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的参数都与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)
我的问题是,有没有办法(最好是通过Annotation)告诉Hibernate让ClassB中的参数映射到它自己的表?我尝试过使用@SecondaryTable但是没有用。
提前致谢!
答案 0 :(得分:2)
在对此发表评论的人的帮助下,我能够提出以下解决方案:
@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)
的Spring时,ClassB
也会正确地保存在数据库中。