当前位置: 首页 > 知识库问答 >
问题:

Hibernate忽略@JoinCol一身映射的列值

范彭亮
2023-03-14

我有一个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的方法。所以,在这里,我正在寻找基于第一种方法的解决方案,我可以根据应用程序的需求定义一个连接列名称。所以这个问题和另一个问题没有关系。


共有1个答案

宣星光
2023-03-14

尝试以下方法:

在类状态下,替换

@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忽略该字段 问题是,给定我的对象具有如此多的字段,忽略每个映射器类中的每个属性将需要大量的代码。我也不想在我的日志上出现这个