java - Hibernate 忽略@OneToMany 映射的@JoinColumn 值

标签 java mysql hibernate orm spring-data-jpa

我有一个 hibernate 代码,它与默认的连接列值一起工作得很好,但是当我将连接列值更改为应用程序约定所需的值时,它开始中断。
之前:@JoinColumn(name="state_name") List<City> cities;
之后:@JoinColumn(name="state_nm") List<City> cities;

问题是 hibernate 正在创建给定的列 state_nm在表中,但它没有使用它。表输出如下。

mysql> select * from city;
+------------+------------+------------+----------+
| name       | population | state_name | state_nm |
+------------+------------+------------+----------+
| BayArea    | 7200000    | CA         | NULL     |
| Detriot    | 630000     | MI         | NULL     |
| LA         | 3900000    | CA         | NULL     |
| Miami      | 466000     | FL         | NULL     |
| RapidsCity | 188000     | MI         | NULL     |
+------------+------------+------------+----------+
5 rows in set (0.00 sec)

如您所见,hibernate 仍然继续并创建了 state_name列,因此连接返回空结果。

2019-09-09 19:59:14.807 DEBUG 7812 --- [  restartedMain] org.hibernate.SQL                        : 
    create table city (
       name varchar(255) not null,
        population varchar(255),
        state_name varchar(255),
        state_nm varchar(255),
        primary key (name)
    ) engine=InnoDB
2019-09-09 19:59:16.158 DEBUG 7812 --- [  restartedMain] org.hibernate.SQL 

Java 模型实体如下:

@Table(name="state")
@Entity
public class State { 

    @Id
    @Column(name="name")
    String name;
    @Column(name="population") 
    String population;  

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="state_nm") 
    List<City> cities;

    @ManyToOne //(cascade=CascadeType.ALL, fetch=FetchType.EAGER) // don't use cascade all with ManyToOne, atleast for now
    Country country; 
    getters/setters

@Table(name="city")
@Entity
public class City {

        @Id
        @Column(name="name")
        String name;

        @Column(name="population")
        String population;

        @ManyToOne 
        State state;
        getters/setters

有关此行为原因的任何提示。

代码可以在分支“joincolumn_issue”中找到: https://github.com/samshers/graphql-hibernate/tree/joincolumn_issue

编辑:这个问题是不同的。首先,它与@Column 或@JoinColumn 无关,它与能够为@JoinColumn 提供用户定义的名称有关。 Hibernate 提供了三种实现 OneToMany 映射的方法。这个问题中发布的方法可以被认为是一种方法。 @Sterconium 的答案可以看作是使用 mappedBy 的第二种方法。接下来是一个基于@JoinTable 的方法。因此,我在这里寻找基于第一种方法的解决方案,我可以根据应用程序需求定义连接列名称。所以这个问题与other没有任何关系。问题。

最佳答案

尝试以下操作:

在类 State 上,替换

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="state_nm") 
List<City> cities;

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy = "state")
List<City> cities;

City 类中,替换

@ManyToOne 
State state;

@ManyToOne
@JoinColumn(name="state_nm")
State state;

我想可以概括为

  • City 而不是 State 上定义关系(不确定术语,我是 hibernate 新手);
  • 使用@JoinColumn代替@Column

通过这样做,记录的创建城市查询变为:

2019-09-09 17:49:37.821 DEBUG 3180 --- [  restartedMain] org.hibernate.SQL                        : 

    create table city (
       name varchar(255) not null,
        population varchar(255),
        state_nm varchar(255),
        primary key (name)
    ) engine=InnoDB

记录的约束是:

2019-09-09 17:49:39.033 DEBUG 3180 --- [  restartedMain] org.hibernate.SQL                        : 

    alter table city 
       add constraint FKnpj8mmul6j6kcl7p90bdo1gj7 
       foreign key (state_nm) 
       references state (name)

我提到了 this tutorialthis question

希望对你有帮助

关于java - Hibernate 忽略@OneToMany 映射的@JoinColumn 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57856230/

相关文章:

java - 如何使用两张 map 并制作另一张 map ?

java - CriteriaBuilder 即时到 postgres TIMESTAMP 转换

java - 在 CRUD 问题中添加功能时出现问题

java - @BatchSize 在 Hibernate 中如何工作深入解释?

java - java中mysql的语法错误

java - 在 OSGi 框架中运行基于 SWT 的 GUI

mysql - 从表中选择总和,其中字段位于另一个带有字段的表中

php - 何时更喜欢 XAMPP 而不是 Linux、Apache、MySQL 和 PHP 的完整安装

mysql - Lua连接MySQL

java - Eclipse Spring Bean创建错误