Hibernate实体类映射到两个不同的表

时间:2015-11-19 23:29:56

标签: java spring hibernate spring-data

我正在尝试将@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但是没有用。

提前致谢!

1 个答案:

答案 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也会正确地保存在数据库中。