【问题标题】:Hibernate OneToOne Table join休眠 OneToOne 表连接
【发布时间】:2016-04-11 13:37:28
【问题描述】:

学习休眠。 我有以下类用户,地区,国家如下

     public class User {

     @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
     private int id;
     @Column(name = "first_name")
     Private String firstName;
     @Column(name = "last_name")
     private String lastName;
     @OneToOne(fetch = FetchType.EAGER)
     @JoinTable(name = "user_country_region", joinColumns ={@JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name =   "country_id") })
     private Country userCountry;

     @OneToOne(fetch = FetchType.EAGER)
     @JoinTable(name = "user_country_region", joinColumns = {@JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "region_id") })
     private Region userRegion;

     //With its respective Getters and Setters 
   }

    public class Country {

     @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
     private int id;
     @Column(name = "name")
     private String name;

     //With its respective Getters and Setters 
   }

   public class Region {

     @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
     private int id;
     @Column(name = "name")
     private String name;

     //With its respective Getters and Setters 
   }

我面临的问题是休眠查询只返回地区而不是国家。这可能是什么原因造成的?

尝试获取国家和地区值如下

    System.out.println("Country: "+user.getCountry().getName());
    System.out.println("Region: "+user.getRegion().getName());

来自 Hibernate Show sql 的响应。似乎缺少国家/地区详细信息。

    Hibernate: 
    select
       this_.id as id1_3_3_,
       this_.first_name as first_na2_3_3_,
       this_.last_name as last_na3_3_3_,
       region2_.id as id1_8_2_,
       region2_.name as name2_8_2_ 
    from
       user this_ 
    left outer join
       user_country_region this_1_ 
       on this_.id=this_1_.user_id  
    left outer join
    region region2_ 
       on this_1_.region_id=region2_.id 
    where
    this_.id=?

【问题讨论】:

  • 您能否确认一下您的表格名称。用户国家地区,用户国家地区?两者都正确吗?只是从基础开始?
  • 是的,它们是一样的。表中的字段如下user_id、country_id、region_id。该表连接了三者。
  • 刚刚更新了我如何尝试初始化用户国家和地区的问题
  • 不是初始化代码。 Hibernate 使用User 获取所有数据,原因是fetch = FetchType.EAGER。请启用 SQL 日志记录并将日志添加到您的问题中,以查看 Hibernate 如何获取数据。
  • 我已更新问题并附上休眠 SQL 响应。

标签: java spring hibernate model-view-controller


【解决方案1】:

这是一个无效的映射。在通过 Hibernate 创建模式时,我在 Hibernate 5 中遇到此错误。

org.hibernate.boot.spi.InFlightMetadataCollector$DuplicateSecondaryTableException: 
Table with that name [user_country_region] already associated with entity

无论如何,如果您可以将此映射与您的 Hibernate 版本一起使用,那么对于两个关系的连接表进行此类映射很容易出错。

只需使用此映射通过外键列将UserCountryRegion 相关联。

public class User {

     @OneToOne
     private Country country;

     @OneToOne
     private Region region;

   }

【讨论】:

  • 似乎不存在其他奇怪的解决方案。必须解决这个问题。
  • 当我从 OneToOne 更改为 @ManyToMany 时有效。如何?我不知道。
猜你喜欢
  • 2011-02-13
  • 2017-09-25
  • 2016-09-07
  • 2021-06-25
  • 2012-10-14
  • 2012-07-30
  • 2011-02-25
  • 2014-12-27
相关资源
最近更新 更多