Hibernate EntityManager不能分配id吗?
JPA2中是否存在合并不会分配@Id变量的特定情况?然后返回实体的新实例而不触发异常 假设我有这样的层次结构:Hibernate EntityManager不能分配id吗?,hibernate,jpa-2.0,Hibernate,Jpa 2.0,JPA2中是否存在合并不会分配@Id变量的特定情况?然后返回实体的新实例而不触发异常 假设我有这样的层次结构: @MappedSuperclass abstract class Bar { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; ... } @Entity @Table(name = "BAR_1S") @Access(AccessType.PROPERTY) class Ba
@MappedSuperclass
abstract class Bar {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
...
}
@Entity
@Table(name = "BAR_1S")
@Access(AccessType.PROPERTY)
class Bar1 extends Bar {
...
}
@Entity
@Table(name = "BAR_2S")
@Access(AccessType.PROPERTY)
class Bar2 extends Bar {
...
}
由于一个尚未找到的原因,Bar1的实例在合并后获得了一个id,而Bar2的实例没有。至少看起来是这样的。我一直在尝试各种各样的方法
Hibernate 4.1.4.Final似乎不想为该特定类的实例分配id:-
我的问题是:
有人有过这样的经历吗
有人能告诉我在Hibernate中id设置在哪里吗?所以我可以调试这部分代码,并找出它跳过赋值的原因。IntelliJ似乎没有破坏实体中字段的修改
编辑-环境配置
操作系统:LMDE amd64
数据库:MySQL 5.1.61-2 ConnectJ 5.1.17
JVM:1.7.0_04
休眠:4.1.4.4最终版本
春季:3.1.1
编辑代码
所有实体类都是Bar的间接子类。只有一个地方定义了@Id。也有一些相同的情况下,Bar2可以得到一个id,但具体来说,Bar2没有
最终钢筋1=新钢筋1;
JpaTemplate.mergebar 第一个注意事项:JpaTemplate已弃用,不应再使用。它只是委托给EntityManager的合并方法,两者都返回一个实体 以下是JPA规范关于合并的说明: 如果X是新的实体实例,则新的托管实体实例X'为 创建并将X的状态复制到新的托管实体中 实例X’ 因此,如果生成了ID,它将被指定给附加的实体,而不是传递给合并方法的对象。因此,永远不要忽略merge方法的结果。而不是
jpaTemplate.merge(bar);
你应该做:
bar = jpaTemplate.merge(bar);
此外,JPA规范还指出
生成的id在
数据库插入已发生
这可能是您没有ID的另一个原因。AFAIK,MySQL的自动策略依赖于数据库中的自动增量ID列,只有在插入完成后才能获取ID值,Hibernate会等到绝对需要刷新时才执行插入。如果确实需要在合并后立即使用ID,请执行以下操作:
bar = jpaTemplate.merge(bar);
jpaTemplate.flush();
Long id = bar.getId();
找到了!合并发生在由@Transactional注释的重载方法中。我假设重载方法将继承注释。显然情况并非如此 通过使用@Transactional注释重载方法,它似乎可以工作
知道这会是一件愚蠢的事情…AUTO和数据库的策略是什么?你用来合并Bar2的代码是什么?