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

标签 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
}

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/

相关文章:

java - Yocto 构建上的 libc6-i386 安装

java - Spymemcached 与 hibernate-memcached 和 webapp-runner 冲突

java - 通过其实例变量之一对对象的 ArrayList 进行排序

java - Junit/Spring Boot 模拟类

java - 使用@Transactional时无法捕获的异常

java - 如何在JPA/Hibernate中根据两个外键生成id?

java - Spring Boot REST 强制响应类型/401 自定义页面不起作用?

java - Spring 集成: File Reading Splitting and Message Filtering

java - Spring session bean管理

hibernate - 如何设置Hibernate Gradle插件来增强字节码?