@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="myseq")
@SequenceGenerator(name="myseq",sequenceName="MY_SEQ")
private long id;
generator="myseq"
注释@GeneratedValue
和name="myseq"
@SequenceGenerator
中Java.Lang.IllegalArgumentException
的重要性。对所有实体使用相同的生成器名称是好的做法,还是应该为每个实体提供不同的名称,目前我对每个实体都有不同的顺序,请咨询
答案 0 :(得分:1)
@SequenceGenerator
定义了用于生成实体主键的生成器。
其name
属性为其提供了一个名称,以便在@GeneratedValue
注释中引用它。 sequenceName
参数表示实际数据库中序列的名称。因此,在这种情况下,Hibernate将在您的数据库中查找名为MY_SEQ
的序列。
@SequenceGenerator(name="myseq", sequenceName="MY_SEQ")
接下来你有@GeneratedValue
。您可以指定用于PK生成的策略(序列,表等)和生成器(由您在上面的序列生成器定义中指定的名称引用)。
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="myseq")
因此,为了回答您的问题,这些注释的name
/ generator
参数用于命名和引用应该用于生成PK的生成器。
答案 1 :(得分:0)
问题的答案可以从javadoc读到@SequenceGenerator:
定义在为GeneratedValue批注指定生成元素时可以通过名称引用的主键生成器。可以在实体类或主键字段或属性上指定序列生成器。 生成器名称的范围是全局到持久性单元(跨所有生成器类型)。
我强调了生成器名称的范围是全局到持久性单元这一重要事项 - 这是由规范定义的,因此你不能定义多个生成器同名。但是,如果将其名称放在generator
注释的@GeneratedValue
字段中,则可以将已定义的生成器重用于多个主键。在这种情况下,我建议在类似于命名查询的实体上定义@SequenceGenerator,而不是在特定PK上定义它。
如果每个实体都有单独的序列,则必须为每个生成器指定一个不同的名称。然后,您必须在@GeneratedValue
中使用此名称。如果不这样做,将使用默认生成器,这与任何@SequenceGenerator
定义的生成器完全不同。这就是它,即使我更喜欢使用而不是默认生成器,生成器与主键字段一起定义,并且将使用@GeneratedValue
注释。 Java EE API只是接近理想,但仍然不存在......
为了说明,下面的代码将使用默认序列生成器,如果允许,它将由hibernate自动创建。:
@Entity
public class Entity {
@GeneratedValue(strategy=GenerationType.SEQUENCE) // generator is missing, using default generator
@SequenceGenerator(name="myseq", sequenceName="MY_SEQ") // name is required for generator, but it is not used with @GeneratedValue on this field
private Long id;
}
另一方面,您可以定义您的生成器并使用它来生成实体类的PK值:
@Entity
@SequenceGenerator(name="myseq", sequenceName="MY_SEQ") // name is required for generator, it is referenced by generator field in @GeneratedValue below
public class Entity {
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="myseq") // generator myseq defined above is used
private Long id;
}
您甚至可以将@SequenceGenerator
注释放在不同的实体上,只要您仍然在@GeneratedValue
的生成器字段中通过其名称引用它,它就没有任何区别。
答案 2 :(得分:-1)
调用MY_SEQ序列,将'long id'的值设为MY_SEQ + 1