【问题标题】:Hibernate CollectionTable - How to set the name of mapped table's column name?Hibernate CollectionTable - 如何设置映射表的列名?
【发布时间】:2019-08-15 19:19:13
【问题描述】:

我正在 Spring RESTfull API 中创建 @CollectionTable。我有一个名为 University 的实体表。现在我正在创建一个名为 TargetedGift 的实体,其中我将有一个大学 ID 列表,该列表将存储在 PostgreSQL 数据库中。

TargetedGift 实体会这样:

@Data
@Entity
@Table(name = "targeted_gifts")
public class TargetedGift { 
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "targeted_gift_id_generator")
        @SequenceGenerator(name = "targeted_gift_id_generator", 
         allocationSize 
        = 1)
        @Column(name="targeted_gift_id")
        private int targetedGiftID;

大学实体类会这样:

@Data
@Entity
@Table(name ="universities")
public class DatabaseUniversity extends BasicEntity {

    @Column(name = "university_id")
    @Id
    private int universityId;

    @Column(name = "university_name")
    private String universityName;
    @ManyToOne
    @JoinColumn(name = "city_id")
    private DatabaseCity city;
    @Column(name = "country_id")
    private int country_id;
    @Override
    public Integer getId() {
        return universityId;
    }

}

我已经有一个单独的表,用于存储大学详细信息。在 TargetedGift 实体中,我想创建一个 CollectionTable,它将在 CollectionTableUniversitiesOneToMany 关系/strong> 并且此关系将存储在名为 targeted_univeristy_ids 的单独表中。

我可以成功创建关系表,根据需要设置表名,也可以设置连接列名(TargeredGift实体的主键)。但我无法为映射实体(大学)的主键设置名称。 Hibernate 自动生成一个名称为universityid_university_id。我希望将其更改为仅university_id'.

我在互联网上搜索了这个问题,发现很少有与我的问题相关的线程与Stackoverflow 相关联,这有助于我为 TargetedGift 实体的joinColumn 设置名称。到目前为止,我的 targeted_univeristy_ids 中的列看起来像这样:

table name: targeted_univeristy_ids columns name: -targeted_gift_id - universityid_university_id

Here is one thread 有很好的解释来重命名相应的列。

@ElementCollection
  @CollectionTable(name = "staff_privileges", joinColumns = 
  @JoinColumn(name = "id_user"))
  @MapKeyColumn(name = "privileges_id")
  @Column(name = "privileges_status")
  private Map<Integer, Boolean> privileges; // privilegeId <-> isEnabled

按照上面的例子,我了解到@joinColumns 表示它所在的当前实体,在我的例子中,TargetedGift 和 底部@olumn 表示外部表的主键,在我的例子中是'大学的id(university_id)。我按照这个例子,到目前为止得到了我上面提到的结果。目前我的代码如下所示:

    @OneToMany(fetch = FetchType.LAZY)
    @CollectionTable(name = "targeted_univeristy_ids" , joinColumns = 
    @JoinColumn(name = "targeted_gift_id", referencedColumnName = 
    "targeted_gift_id"))
   //@MapKeyColumn(name = "university_id")
    @Column(name = "university_id")
    private List<DatabaseUniversity> universityID;

现在我正在寻找一种解决方案,将大学的 id 列名称从 universityid_university_id 设置为简单的 university_id

【问题讨论】:

    标签: java hibernate jpa spring-data-jpa


    【解决方案1】:

    我找到了解决方案。我错误地将其创建为@CollectionTable,我必须将其创建为@JoinTable。下面是代码,解决了我的问题:

        @OneToMany(fetch = FetchType.LAZY)
        @JoinTable(
                name="targeted_universities",
                joinColumns = @JoinColumn( name="targeted_gift_id"),
                inverseJoinColumns = @JoinColumn( name="university_id")
        )
        private List<DatabaseUniversity> universities;
    

    【讨论】:

      猜你喜欢
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 2012-11-20
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 2022-08-15
      相关资源
      最近更新 更多