我有一个 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 tutorial和 this question
希望对你有帮助
关于java - Hibernate 忽略@OneToMany 映射的@JoinColumn 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57856230/