OpenJPA,EJB中的entityManager,实体共享相同的序列

时间:2018-04-04 06:36:44

标签: jpa ejb entitymanager openjpa

我的项目中有几个实体,所有实体都扩展了这个抽象类:

@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生成器返回的序列,并忽略它们自己的序列。序列。

我尝试为某些实体设置一个不存在的序列,程序会在尝试获取下一个值时崩溃,但是,一旦我修复它们,它们将被忽略并且将采用另一个序列的值。

我认为这里的问题可能与在任何地方使用相同的实体管理器有关,但我不确定为什么其他所有工作都按预期工作,只有序列混乱。

1 个答案:

答案 0 :(得分:0)

问题在于注释@SequenceGenerator需要具有唯一名称。为每个实体使用不同的名称,而不是AbstractClass.GENERATOR解决了这个问题。

它可能适用于JPA的另一个实现,但是如果你尝试使用OpenJPA,你会发现这个错误。