我正在尝试将我的 @Entity
对象映射到它们各自的类,其中一个是另一个的参数。
简单地说,我有这样的东西:
@Entity
@Table(name="TableA")
public class ClassA {
@Id
private long id;
private String paramA;
private ClassB classB;
// getters and setters here
}
B 类看起来像:
@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 但没有用。
提前致谢!
最佳答案
在对此发表评论的人的帮助下,我得出了以下解决方案:
@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
现在,当我调用 Spring 注入(inject)的 ClassADao.save(classA)
时,ClassB
也会免费正确地保存在数据库中。
关于java - Hibernate 实体类映射到两个不同的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33816296/