当前位置: 首页 > 面试题库 >

Hibernate是否应该能够处理重叠的外键?

海鸣
2023-03-14
问题内容

我有一个表,该表具有指向两个不同表的两个外键,两个外键 共享一个列

CREATE TABLE ZipAreas
(
  country_code CHAR(2) NOT NULL,
  zip_code VARCHAR(10) NOT NULL,
  state_code VARCHAR(5) NOT NULL,
  city_name VARCHAR(100) NOT NULL,
  PRIMARY KEY (country_code, zip_code, state_code, city_name),
  FOREIGN KEY (country_code, zip_code) REFERENCES Zips (country_code, code),
  FOREIGN KEY (country_code, state_code, city_name) REFERENCES Cities (country_code, state_code, name)
)

如您所见,有两个FK共享country_code(恰好在引用路径的末尾引用同一列)。实体类看起来像(JPA 1.0 @IdClass):

@Entity
@Table(name = "ZipAreas")
@IdClass(value = ZipAreaId.class)
public class ZipArea implements Serializable
{
    @Id
    @Column(name = "country_code", insertable = false, updatable = false)
    private String countryCode;

    @Id
    @Column(name = "zip_code", insertable = false, updatable = false)
    private String zipCode;

    @Id
    @Column(name = "state_code", insertable = false, updatable = false)
    private String stateCode;

    @Id
    @Column(name = "city_name", insertable = false, updatable = false)
    private String cityName;

    @ManyToOne
    @JoinColumns(value = {@JoinColumn(name = "country_code", referencedColumnName = "country_code"), @JoinColumn(name = "zip_code", referencedColumnName = "code")})
    private Zip zip = null;

    @ManyToOne
    @JoinColumns(value = {@JoinColumn(name = "country_code", referencedColumnName = "country_code", insertable = false, updatable = false), @JoinColumn(name = "state_code", referencedColumnName = "state_code"), @JoinColumn(name = "city_name", referencedColumnName = "name")})
    private City city = null;

    ...
}

如您所见,我将countryCode属性和城市的country_code @JoinColumn标记为只读(insertable = false,可更新=
false)。Hibernate失败了,这句话说:

Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: geoinfo] Unable to configure EntityManagerFactory
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:374)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
    at tld.geoinfo.Main.main(Main.java:27)
Caused by: org.hibernate.AnnotationException: Mixing insertable and non insertable columns in a property is not allowed: tld.geoinfo.model.ZipAreacity
    at org.hibernate.cfg.Ejb3Column.checkPropertyConsistency(Ejb3Column.java:563)
    at org.hibernate.cfg.AnnotationBinder.bindManyToOne(AnnotationBinder.java:2703)
    at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1600)
    at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:796)
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:707)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3977)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3931)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1368)
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1345)
    at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1477)
    at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1096)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:278)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:362)
    ... 4 more

老实说,这对我来说很基本。“不允许在属性中混合可插入和不可插入的列”是一个很弱的“借口”,不是吗?

Hibernate是否应该能够按照JPA规范进行处理?这是错误吗?


问题答案:

Hibernate
5将支持,请参阅https://hibernate.atlassian.net/browse/HHH-6221



 类似资料:
  • 我使用的布局与此类似: 现在我想在布局上执行两个动画: 淡出(AlphaAnimation)并将右侧的所有视图翻译为左侧 淡入并将所有视图翻译回左侧 以下是我用于动画的代码: 当动画结束时,通过调用view.clearAnimations()并设置正确的layoutParams,动画更改成为永久性的。 动画1可以完美地工作,但动画2不能。除了的淡入,其他一切都正常工作。直到动画结束,才可见,即在动

  • 字节伙伴代理是否能够克服附加API限制,例如“新方法定义”、“静态变量更改”?我可以看到,正在从代理生成器调用重定义类方法,但不确定这是否也遵循与附加API相同的限制。 我试图了解我是否可以做到以下几点: 1) 使用应用程序类加载器加载代理jar,例如并行WebAppClassLoader。我的应用程序是一个servlet webapp,在运行时它使用上面的类加载器加载所有应用程序类。 2) 完全

  • 众所周知,我们可以像ProjectLombook的工作人员一样,使用自定义注释和Java注释处理器自动生成代码。但是我们可以从编译的源代码中删除带注释的代码吗? 我试着在网上搜索它,但只出现了“生成代码”主题和“如何生成带有一个注释的服务器”教程。当我在寻找从prod应用程序“编译”调试消息的方法时,我想到了这一点。我可以理解,拥有调试/测试和生产代码不是一个好的实践,但有时需要保持简单。我认为这

  • 问题内容: 我没有使用Spring,所以正在类中创建EntityManager的实例。 我使用了Hibernate-Eclipse逆向工程来自动生成类。这些类都有一个EntityManager的实例。 我不确定100%Hibernate如何与EntityManager一起工作,所以我想知道是否可以创建这么多的此类实例(EntityManager),例如,事务是否会出现问题? 我是否应该仅创建一个单

  • 本文向大家介绍外边距重叠是什么?重叠的结果是什么?怎么防止外边距重叠?相关面试题,主要包含被问及外边距重叠是什么?重叠的结果是什么?怎么防止外边距重叠?时的应答技巧和注意事项,需要的朋友参考一下 外边距重叠是什么? 外边距重叠指的是,当两个垂直外边距相遇时,它们将形成一个外边距。 重叠后的外边距的高度等于两个发生重叠的外边距的高度中的较大者。 发生的条件:属于同一个BFC的两个相邻元素上下marg

  • 我有一些实体: 当我试图保存新的cbonus记录时,出现异常: org.postgresql.util.PSQLException: ERROR: null值在列"bank_id"的关系"cBonus"违反了非空约束详细信息:失败的行包含(773, gp3, null, null, f)。 和查询 DEBUG 24817-[nio-8080-exec-4]org . hibernate . SQL