我有一个hibernate代码,它与默认的联接列值配合得很好,但是当我将联接列值更改为应用程序约定所需的值时,它开始崩溃。
之前:@JoinColumn(name=“state\u name”)列表
问题是hibernate正在表中创建给定列
state\u 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\u 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
编辑:这个问题不一样。首先,它不是关于@列或@连接列,而是关于能够为@连接列提供用户定义的名称。Hibernate提供了三种进行OneTo多映射的方法。这个问题中的方法可以被认为是一种方法。来自@Sterconium的答案可以被看作是第二种方法,其中使用了mappdBy。接下来是基于@JoinTable的方法。所以,在这里,我正在寻找基于第一种方法的解决方案,我可以根据应用程序的需求定义一个连接列名称。所以这个问题和另一个问题没有关系。
尝试以下方法:
在类状态下
,替换
@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;
在类城市
中,替换
@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)
我参考了这个教程和这个问题
希望我能帮忙
是否有可能不在HiberNate中的实体层次结构中间为类创建表? 我想指出某些实体是某种类型的子集,以便返回所有这些实体的集合,但我不会在此中间类型中放置任何额外的属性。因此,保留带有id字段的额外表只是为了连接表,这听起来并不好。 更好的解决方案是实现一些公共接口< code>CommonInterface,但是这样我就失去了返回< code>List的可能性
问题内容: 我有一个MySQL表来保存标签(即像在Stack Overflow上使用的那些标签)。它仅具有一个id(pk)和一个标签列来保存标签本身。 我的Tag实体的带注释的get方法如下所示。 我在标签上使用了唯一的列约束,因为给定标签的行不应超过一行。但是,Hibernate似乎忽略了这一点,即我可以多次保存完全相同的标签,并且它只是创建一个新行而不是抛出异常。 我是否缺少某些东西,还是应该
我正在与MapStruct的循环依赖问题作斗争。由于循环依赖,我一直有一个StackOverFlow错误。为了避免它,我只需要排除一个列表的属性。我发现了这个:https://github.com/mapstruct/mapstruct/issues/933我在网上查了很久,我很惊讶我找不到任何完整的例子来展示使用MapStruct的双向DTO映射(除了使用< code > @ Context c
我使用@JsonTypeInfo和@JsonSubTypes来映射基于给定属性的解析子类。下面是我想要解析的示例JSON的一个人为示例。 用这个作为课堂 但是,当JSON包含我想要忽略的类型时,就会出现问题。例如,如果我有一个新类型的“猪”,我真的不想反序列化为对象: 并尝试解析它,它会给我这个错误: 无法将类型id猪解析为[简单类型,类动物]的子类型 我如何修复它,这样我就可以只绘制那些“狗”和
我正在使用Hibernate和JPA注释来映射我的类。当hibernate尝试映射这个类时,我遇到了一个问题 我的Social alStat类是: 我得到了这个错误: 我猜发生这种情况是因为我试图映射到一个基本类,但@ElementCollection注释不应该解决这个问题吗? 我的item类如下所示:
我正在使用MapStruct和在我的代码中的不同业务用例之间共享的大模型(超过50个字段)。根据入口点的不同,有些属性将被映射,有些则不被映射。当我构建我的项目时,我总是会得到“警告:未映射的目标属性”消息。 我已经研究过,并且看到可以通过使用语义命令来告诉mapstruct忽略该字段 问题是,给定我的对象具有如此多的字段,忽略每个映射器类中的每个属性将需要大量的代码。我也不想在我的日志上出现这个