- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
亲爱的 future 读者:在完成 Sannes answer 之后和他提供的链接,我决定改用序列。较新的 Hibernates 会注意它也适用于 MySQL。
我有一个 abstract
类,其中包含我希望在所有实体中拥有的一些基本值(例如 ID、创建日期、创建用户等)。目前,我正在努力解决每个具体类都有一个表并使其 id 工作的组合。
看来我可以为每个类(class)配置一张表,也可以在一个地方配置 ID,但不能同时配置两者。这对我来说似乎很奇怪而且不太可能,所以我想确保情况确实如此。
可能相关的版本:hibernate 5、mysql 5.5、java 1.8、spring 4.3。
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@MappedSuperclass
public abstract class GeneralData implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
protected int id;
protected String name;
// getters, setters, constructors, etc.
}
示例子类:
@Entity
public class ExampleClass extends GeneralData {
// own values, constructors, getters, setters, etc.
}
我得到的错误:
Cannot use identity column key generation with <union-subclass> mapping for: org.example.ExampleClass
我尝试过的事情:
GeneralData
设为 @Entity
,但这没有帮助。GenerationType.TABLE
但由于 key 太大而失败。 (另外,我宁愿没有这个,IDENTITY 是我想要的)错误:指定的 key 太长;最大 key 长度为 1000 字节
我不想将 id 列移动到每个具体类。如果 ID 仅对于单个表而不是整个依赖树是唯一的,我完全没问题。
如果我应该升级我的库、数据库等,请记住,这只能通过大量额外的工作来完成(出于内部原因)。这将是最后的手段,我希望首先看到一些它有帮助的证据。
最佳答案
对同一父实体的所有子对象的要求是它们之间具有唯一的 ID。
例如,假设您有一个父实体 GeneralData
,然后使用 id=1 存储子类型 A
。这将是完全合法的:
GeneralData loaded = entitymanager.find( GeneralData.class, 1 );
当然 loaded
的类型将是 A
:子类。 映射必须确保没有歧义:不允许其他子类也使用“1”作为 ID,即使它映射到不同的表中也是如此。
在您的情况下,您要求 Hibernate 将 GeneralData
的每个不同子类型存储到它自己的单独表中。
您还要求 MySQL - 它不知道这些表以任何方式相关 - 自动分配唯一标识符。
不可能指示 MySQL 这些表中的每一个都需要使用相同的Identity
“序列”,因为它们不是真正的序列:所以这个映射是非法的!这会给您带来麻烦,因为它会将重叠的 ID 分配给父实体的不同子类型,这违反了上述语义。
这是使用 IDENTITY 的局限性的一个很好的例子;此外,IDENTITY 不是很有效,因为它意味着 Hibernate 需要在实体持久化后立即写入实体,而不是能够更有效地将刷新操作推迟到更合适的时间,因此可能会批量写入或完全跳过它们(特别是如果事务被中止,而且如果您在持久化之后更新实体但仍在同一事务中)。
我建议看看不同的 Identifier generator strategies对于这样的层次结构,特别是 Optimizers可能会大大提高您的应用程序的性能。
关于java - 我如何结合 TABLE_PER_CLASS 和 GenerationType.IDENTITY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47455957/
目前,我们使用MySQL作为数据库,并且我们使用 @Generate Value(strategy = GenerationType.IDENTITY) 在某些情况下它工作得很好,我们需要将数据库迁移
目前,我们使用 MySQL 作为数据库,我们使用 @Generated Value(strategy = GenerationType.IDENTITY) 在我们需要将数据库迁移到 Oracle 的某
我有类似的问题 this SO question .但是我的应用程序正在 MySQL 上运行,并且有工作数据。 使用填充有数据的现有数据库重构应用程序的最佳做法是什么? 最佳答案 TABLE_PER_
我正在研究一个要求,其中代码应支持 Oracle 和 MySQL 数据库。我们正在使用 hibernate 并尝试使用框架功能来实现相同的目标。对于 Identity 列,我们使用 @Generate
我的应用程序使用 DB2。创建数据库后我运行一些插入脚本。该插入脚本会在表中生成记录,并在插入脚本中给出 id。 假设 abc 表插入脚本创建一条 id = 3 的记录。由于 id 设置为在 hibe
我有一个具有以下结构的部门表 Field Type Null Key Default Extra id int(11)
我正在从事一个项目,我需要存储一些数据(当然还有其他数据)。生产数据库将是MySQL,但对于我的测试,我使用 HyperSQL (又名 HSQLDB)。 我的所有@Enitity类都有相应的@Id字段
我有一个网络表单,用户可以在其中插入数据。然后还有存储在数据库中。但我在数据库记录中遇到了问题。我使用 spring 3、jpa、eclipselink 和 mysql。在实体中生成@Id。当我使用策
我有一个表,其中包含一个简单的 int id 列,在 SQL Server 中标识自动递增。 实体的 Id 用 @Id 和 @GeneratedValue 注释 @Id @GeneratedValue
Hibernate documentations (5.1.2.2. Identifier generator)州 AUTO: selects IDENTITY, SEQUENCE or TABLE
这是我的实体文件:- @Entity @Table(name = "tbl_article_function_instruction_status") @XmlRootElement public c
那么自动生成函数“@GenerateValue(strategy = GenerationType.AUTO)”到底是如何工作的呢? 我是 Hibernate 的新手,并且继承了一个广泛使用的项目。
我正在尝试将对象持久保存到数据库中。不断收到“列 ID 无法接受空值错误”。我的对象如下所示: @Entity public class TestTable { @Id @Ge
我有一个 ID 配置为的 hibernate 实体 @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; 新元素的创建在
我在同一个项目中有几个类,其中 id 始终是自动生成的。然而,在这种特定情况下,我的 id 值恰好始终为空。我真的很想知道出了什么问题,因为经过一些更改后它停止工作。与其他类相比,代码似乎是相同的。
由于 Spring Boot 2 使用 Hibernate 5,因此我的 MySQL 5.7 数据库的 @GenerateValue 默认策略 GenerationType.AUTO 会导致模拟 Ge
我的实体类: import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Ge
似乎我坚持的一切,它一直在 id 中输入 401,导致这个错误。有什么帮助吗? 异常 Exception [EclipseLink-4002] (Eclipse Persistence Service
我有一个在 JBOss 5、JPA 和 Derby 中运行良好的旧应用程序。我现在将它移植到 JBoss 6,却发现系统无法插入带有错误消息的实体: “ID”列不能接受 NULL 值。 其中,ID为标
我使用 Spring/Hibernate Dao 将我的对象保存在数据库中。现在我必须备份应用程序中的所有数据库。现在,当我尝试读回备份时,我的应用程序崩溃了。现在我发现了这个崩溃的问题。它是 Hib
我是一名优秀的程序员,十分优秀!