Java 如何为Oracle数据库生成唯一的序列号
我们的应用程序有多个实体,是使用Java 如何为Oracle数据库生成唯一的序列号,java,oracle,jpa,Java,Oracle,Jpa,我们的应用程序有多个实体,是使用MySQL数据库开发的。我们所有的实体都扩展了一个公共基础实体 @MappedSuperclass public class BaseEntityData implements Serializable { /** * Data identifier (Usually holds Primary Key) */ private Long id; /** * @return the id */
MySQL
数据库开发的。我们所有的实体都扩展了一个公共基础实体
@MappedSuperclass
public class BaseEntityData implements Serializable
{
/**
* Data identifier (Usually holds Primary Key)
*/
private Long id;
/**
* @return the id
*/
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
public Long getId()
{
return id;
}
/**
* @param value the id to set
*/
public void setId(final Long value)
{
this.id = value;
}
}
我们所有的实体都扩展了BaseEntityData
,所有的东西都在MySQL
数据库上完美运行。在开发过程中,我们没有对Oracle数据库进行测试。我们现在想测试不同客户需求的Oracle数据库
cos,但发现Oracle数据库
不会为主键生成序列号,有时会生成重复键。如何修改这个超级类BaseEntityData
,以便为所有表生成唯一的键。有300多个实体扩展了这个超级类。没有名字的马是对的。对于oracle,您需要创建一个序列并使用该序列生成ID
注释将如下所示
@id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ENTITY_SEQUENCE")
@SequenceGenerator(name="ENTITY_SEQUENCE", sequenceName="ENTITY_SEQUENCE")
看起来您将在一个要扩展的超类中定义id。如果是这种情况,强烈考虑将ID移动到子类级别。在具有多个对象的大型企业应用程序中,您可能希望对单独的实体使用单独的ID序列。使用序列,这是Oracle(以及大多数其他DBMS)的做法。我真的不知道JPA,但我认为“序列”有一个生成策略,这正是我不想做的。实体确实很多。在所有实体中复制id
是我们现在不想做的事情。没有办法让id
在超类中,并且仍然为实体生成不同的id。如果要确保id在所有实体中唯一,请保留在超类中。但请记住,oracle序列有一个上限。。。。。不管怎样,让不相关的实体拥有相同的ID有什么不对?我想要实现的是为不同的表拥有唯一的ID
。但是对于表来说,必须是唯一的。e、 g.表1
将有ID
比如1,2,3,
,表2
有ID
1,2,3,
。这意味着所有表都将生成序列号。是否可以通过在基类中定义id
并使用oracle数据库和序列生成器来实现这一点。好的,首先告诉我这是所有实体将从中扩展的基类还是实际层次结构中的基类?应用程序由多个继承层次结构组成?是的。它是所有实体都已扩展的基类。如果你仔细看一下这个问题,你会发现这个应用程序已经在运行了。因此,系统中的所有实体都已将基类用作其id的源。