首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hibernate中从父级到子级的ID

hibernate中从父级到子级的ID
EN

Stack Overflow用户
提问于 2013-06-14 23:21:29
回答 1查看 3.6K关注 0票数 2

这是我的代码。我想生成一个基于父类的自动ID。我使用一个方法来创建机场,所以我的ID是一个空值。AirportModel中的ID将被生成,但我不知道如何在子类中生成它。

代码语言:javascript
复制
@Entity(name = "Airport")
@Table(name = "ai_airport")
public class AirportModel {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "airport_id")
    private List<AirportTranslatedModel> translations;

第二类(子类):

代码语言:javascript
复制
    @Entity(name = "AirportTranslated")
    @IdClass(AirportTranslatedModelKey.class)
    @Table(name = "ai_translated_airport")
    public class AirportTranslatedModel 
        @Id
        @Column(name="airport_id")
        private Long airportId;

        @Id
        @Column(name="language_code", length=2)
        private String languageCode;

第三个(键):

代码语言:javascript
复制
@Embeddable
public class AirportTranslatedModelKey implements Serializable {

    @Column(name="airport_id")
    private Long airportId;

    @Column(name="language_code", length=2)
    private String languageCode;

我仍然收到相同的错误;日志:

代码语言:javascript
复制
Hibernate: insert into ai_airport (active, airport_code, city_code, country_code, externa
l_id, is_default, latitude, longitude, market_code, min_connection_time_DD, min_connection_time_DI, min_connection_time_id, min_connection_time_II, time_diff, VERSION) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Hibernate: insert into ai_translated_airport (airport_long_name, airport_short_name, airp
ort_id, language_code) values (?, ?, ?, ?)
ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Column 'airport_id' cannot be null
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-15 02:39:31

您当前的设置通过长字符映射了AirportTranslatedModel airport_id字段-您将需要手动设置airportId以使其在数据库中设置id。这可能需要您在建立AirportModel->AirportTranslatedModel关联之前持久化AirportModel和可能的flush,以便在建立AirportModel->AirportTranslatedModel关联之前分配和使用它的PK,这样您就可以设置AirportTranslatedModel.airportId。

不过,JPA 2允许派生Ids。如果您希望从AirportModel分配AirportTranslatedModel的ID,则需要与其建立关系。在http://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/DerivedIdentifiers上有一个简单的例子

如果您要以类似的方式对类进行建模,则可能如下所示:

代码语言:javascript
复制
public class AirportModel {
  ..
  @OneToMany(mappedby="airportModel", cascade = CascadeType.ALL, orphanRemoval = true)
  private List<AirportTranslatedModel> translations;
  ..
}

public class AirportTranslatedModel {
  @Id
  @JoinColumn(name="airport_id")
  private AirportModel airportModel;

  @Id
  @Column(name="language_code", length=2)
  private String languageCode;
  ..
}
public class AirportTranslatedModelKey implements Serializable {
    private Long airportModel;

    private String languageCode;
}

请注意,如果您只是将AirportTranslatedModelKey用作pk类,则不需要使其成为可嵌入的。还要注意,AirportTranslatedModelKey包含一个长AirportModel -它必须与airportModel中的pk类型和AirportTranslatedModel中的关系属性的名称相匹配。

这将允许AirportTranslatedModel从AirportModel中提取airport_id值并将其用作其PK,即使在两个实体仍然是新的时候它可能还没有生成。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17111904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档