我有一个简单的JOINED文档层次结构:
CREATE TABLE Documents
(
  id INTEGER NOT NULL,discriminator ENUM('official','individual','external') NOT NULL,file_name VARCHAR(200) NOT NULL,PRIMARY KEY (id)
);

CREATE SystemDocuments
(
  id INTEGER NOT NULL,binary_data BLOB NOT NULL,PRIMARY KEY (id),FOREIGN KEY (id) REFERENCES Documents (id)
);

CREATE ExternalDocuments
(
  id INTEGER NOT NULL,FOREIGN KEY (id) REFERENCES SystemDocuments (id)
);

您可以看到所有的子表都是从Documents表中共享相同的ID.除此之外,SystemDocuments添加了一个binary_data列,而ExternalDocuments不添加新的属性. (还要注意,层次结构中还有两个其他具体的子表,由’official’和’individual’表示,这在这里是无关的.

以下是上表的映射:

Document.java:

@Entity
@Table(name = "Documents")
@Inheritance(strategy = InheritanceType.JOINED)
@discriminatorColumn(name = "discriminator",discriminatorType = discriminatorType.STRING)
//@discriminatorOptions(force = true) // <-- Hibernate 4-specific annotation not inserting discriminator values
public abstract class Document implements Serializable
{
    @Id
    @Column
    protected Integer id;

    @Column(name = "file_name")
    protected String fileName;

    ...
}

SystemDocument.java:

@Entity
@Table(name = "SystemDocuments")
public abstract class SystemDocument extends Document
{
    @Lob
    @Column(name = "binary_data")
    protected byte[] binaryData;

    ...
}

ExternalDocument.java:

@Entity
@Table(name = "ExternalDocuments")
@discriminatorValue(value = "external")
public class ExternalDocument extends SystemDocument
{
    ...
}

后一类应被映射到文档的标识符列值“外部”.当通过EntityManager发现实体时,识别符被正确地返回,实际上是因为我的测试数据的识别符被正确插入数据块.

现在我使用以下代码通过JPA和文件上传器将新的文档/文件插入到系统中:

...

UploadedFile uf = event.getUploadedFile();

// set ID,file name,and binary data
ExternalDocument detachedExternalDocument =
    new ExternalDocument(1234567,uf.getName(),uf.getData());

docService.create(detachedExternalDocument);

当检查数据库时,我可以看到,Hibernate不会将“外部”鉴别器值插入到“文档”表的标识符列中.

过去有一些问题,见https://hibernate.onjira.com/browse/ANN-140,最近有关于Hibernate 4 https://hibernate.onjira.com/browse/HHH-4358的问题,所以很有可能这样工作.

然后我在当前的Hibernate 4 api文档中找到了http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/annotations/DiscriminatorOptions.html,但它不起作用(参见Document Class中的@discriminatorOptions).

如何让Hibernate 4使用原始注释插入标识符?

注意:我不想将discriminator列映射为常规列.

解决方法

首先,这个问题是 Discriminator in InheritanceType.JOINED的重复.

看起来像JOINED继承中的持久性鉴别器值不是JPA规范所要求的.这是我通过电子邮件从JPA专家组的成员收到的内容:

The spec does not require an implementation to use discriminator columns to implement JOINED inheritance,however,the assumption is that if @discriminatorColumn is specified then it would be used,i.e. the values would be written out. We do not explicitly state that if a @discriminatorColumn is specified in the code it must be used,just like we don’t explicitly state that if a @Column or @JoinColumn is specified the values must be stored in the table,but there is only so much that we can or should specify. At the lowest level,certain laws of physics and reason are just assumed.

手头的问题一直是Hibernate一段时间的问题,请看这里:

https://hibernate.atlassian.net/browse/ANN-140

拒绝评论:

EJB3 does NOT require use of discriminators with JOINED mapping strategies. It is allowed for inferior implementations of the JOINED mapping strategy which require a discriminator. Hibernate does not need a discriminator because Hibernate is better than these other inferior implementations.

最终只有SINGLE_TABLE策略需要一个鉴别器列,JOINED可以实现没有. Hibernate当前的问题是,当使用@discriminatorColumn映射的JOINED继承中持久化子实体时,即使JPA规范建议在JOINED中使用鉴别符时,仍然会持久标识符值,因此它将导致不一致的数据.在RFE中查看更多内容:

https://hibernate.atlassian.net/browse/HHH-6911

java – Hibernate 4:持久化InheritanceType.JOINED标识符列值的更多相关文章

  1. ios – AFNetworking自动持久化Cookie

    在ThisQuestion中说,AFNetworking在后台自动处理cookies,但是在Previous问题中,我遇到麻烦,在登录时在PHP服务器上保持会话.一旦关闭的应用程序,并回到会议已经没了.答案是保持像这样的cookie来解决问题:当我尝试做这样的事情时,这给我一个应用程序崩溃.当我登录时,我设置了NSUserDefault:这是错误的使用方法吗?谢谢.解决方法使用以下内容,这是保存和加载适用于我的Cookie的正确方法:希望有帮助!

  2. Spring Boot日志的打印与持久化详细解析

    Spring Boot默认使用SLF4J+Logback 记录日志,并提供了默认配置,即使我们不进行任何额外配,也可以使用SLF4J+Logback进行日志输出

  3. Hibernate 主清单文件配制的详细介绍

    这篇文章主要介绍了Hibernate 主清单文件配制的详细介绍的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下

  4. Hibernate 查询方式总结

    get() and load() HQL 等查询方式

  5. jsp hibernate的分页代码第1/3页

    在查询分页代码中使用Hibernate的一大好处是,既兼顾了查询分页的性能,同时又保证了代码在不同的数据库之间的可移植性。

  6. JSP 开发之hibernate配置二级缓存的方法

    这篇文章主要介绍了JSP 开发之hibernate配置二级缓存的方法的相关资料,这里提供两种配置二级缓存的方法,需要的朋友可以参考下

  7. Flutter持久化存储之数据库存储(sqflite)详解

    这篇文章主要给大家介绍了关于Flutter持久化存储之数据库存储的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Flutter具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

  8. Vue注册模块与登录状态的持久化实现方法详解

    这篇文章主要介绍了Vue注册模块与登录状态的持久化实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  9. jsp hibernate 数据保存操作的原理

    当执行到session.save()方法时,Hibernate并不会马上生成insert SQL语句来进行数据的保存,而是当稍后清理session的缓存时才有可能执行insert SQL语句,那么session.save()方法到底会执行哪些步骤呢?

  10. JSP开发之hibernate之单向多对一关联的实例

    这篇文章主要介绍了JSP开发之hibernate之单向多对一关联的实例的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部