Hibernate EntityManager不能分配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

JPA2中是否存在合并不会分配@Id变量的特定情况?然后返回实体的新实例而不触发异常

假设我有这样的层次结构:

@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的代码是什么?