我的项目中有几个实体,所有实体都扩展了这个抽象类:
@MappedSuperclass
public abstract class AbstractClass<PK extends Serializable> implements Serializable {
public static final String GENERATOR = "default";
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = GENERATOR)
private PK id;
// setters and getters
}
所有实体都使用相同的注释,因此我只会向您展示一个:
@Entity
@Table(name = "TABLE1")
@SequenceGenerator(name = AbstractClass.GENERATOR, sequenceName = "SEQ_NAME_ENTITY1", allocationSize = 1)
@AttributeOverride(name = "id", column = @Column(name = "ID_ENTITY1", nullable = false, precision = 17, scale = 0))
public class Entity1 extends AbstractClass<Long> {
// Strings, Longs, etc of this entity
}
我项目中的每个实体都有一个不同的sequenceName,因此一个实体有&#34; SEQ_NAME_ENTITY1&#34;,另一个&#34; SEQ_NAME_ENTITY2&#34;等等。
我的包含entityManager的EJB如下所示:
@Stateless
public class PersistenceBean implements IPersistenceBean {
@PersistenceContext(unitName = "MY_UNIT_NAME")
private EntityManager entityManager;
public EntityManager getEntityManager() {
return entityManager;
}
}
我在每个DAO中都使用这个EJB,并像这样使用它:
@Stateless
public class MyDao implements IMyDao {
@EJB
protected IPersistenceBean persistenceBean;
public Entity1 save(Entity1 entity) {
persistenceBean.getEntityManager().persist(entity);
persistenceBean.getEntityManager().flush();
persistenceBean.getEntityManager().refresh(entity);
return entity;
}
}
每个实体的每个DAO看起来都是一样的。
我在这里遇到的问题是,每次插入一个实体时,它们都会重用相同的序列,例如它们都将采用entity4生成器返回的序列,并忽略它们自己的序列。序列。
我尝试为某些实体设置一个不存在的序列,程序会在尝试获取下一个值时崩溃,但是,一旦我修复它们,它们将被忽略并且将采用另一个序列的值。
我认为这里的问题可能与在任何地方使用相同的实体管理器有关,但我不确定为什么其他所有工作都按预期工作,只有序列混乱。
答案 0 :(得分:0)
问题在于注释@SequenceGenerator
需要具有唯一名称。为每个实体使用不同的名称,而不是AbstractClass.GENERATOR
解决了这个问题。
它可能适用于JPA的另一个实现,但是如果你尝试使用OpenJPA,你会发现这个错误。