对于某些不是标识符/不是复合标识符一部分的列,是否可以使用DB序列?
我正在使用hibernate作为jpa提供程序,并且我有一个表有一些生成值的列(使用序列),尽管它们不是标识符的一部分.
我想要的是使用序列为实体创建一个新值,其中序列的列不是主键的一部分:
@Entity
@Table(name = "MyTable")
public class MyEntity {
//...
@Id //... etc
public Long getId() {
return id;
}
//note NO @Id here! but this doesn't work...
@GeneratedValue(strategy = GenerationType.AUTO, generator = "myGen")
@SequenceGenerator(name = "myGen", sequenceName = "MY_SEQUENCE")
@Column(name = "SEQ_VAL", unique = false, nullable = false, insertable = true, updatable = true)
public Long getMySequencedValue(){
return myVal;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,当我这样做:
em.persist(new MyEntity());
Run Code Online (Sandbox Code Playgroud)
将生成id,但该mySequenceVal属性也将由我的JPA提供程序生成.
只是为了说清楚:我希望Hibernate为mySequencedValue属性生成值.我知道Hibernate可以处理数据库生成的值,但是我不想使用触发器或除Hibernate之外的任何其他东西来为我的属性生成值.如果Hibernate可以为主键生成值,为什么它不能为简单属性生成?
这是我的pojo课程
@Entity
public class Department {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="Department_Id")
private Integer deptId;
@Column(name="Department_Name",unique=true,nullable=false)
private String deptName;
@Column(name="Department_Description")
@NotNull
private String deptDesc;
//geters and setters
Run Code Online (Sandbox Code Playgroud)
我想要的是department_id必须是此Department表的主键,此键的条目必须为DEP0001,DEP0002,DEP0003
我正在尝试创建一种自定义的计算方式,并传递遵循我自己的模式的唯一ID.
Hibernate具有@GenericGenerator注释,允许您映射自定义类以计算唯一ID并将其分配回@Id列.
例
@Id
@GeneratedValue(generator="MyIdGenerator")
@GenericGenerator(name="MyIdGenerator", strategy="com.test.MyIdGenerator")
Run Code Online (Sandbox Code Playgroud)
问题是我不想在包级别使用(休眠)@GenericGenerator.这可能是"纯粹的"JPA/2吗?
谢谢你的时间.
如果我的实体已计算字段应在保存到数据库之前更新(db insert或update)如何在Hibernate或Spring Data Repository之前挂钩方法调用save()
我有一个名为Menu的类,注释为@Entity,我需要在名为GestoreMessaggi的类中使用一个方法
....
@Component
@Entity
@Table(name="menu")
public class Menu implements Serializable{
@Autowired
@Transient // because i dont' save this field on the DB
private GestoreMessaggi gestoreMessaggi;
.....
public void setCurrentLanguage(){
/* I got the error both if use gestoreMessaggi
this way and if I use the autowired istance of GestoreMessaggi*/
GestoreMessaggi gestoreMessaggi = new GestoreMessaggi();
gestoreMessaggi.gest();
}
.....
Run Code Online (Sandbox Code Playgroud)
这是GestoreMessaggi类的相关代码
@Component
public class GestoreMessaggi {
@Autowired
private ReloadableResourceBundleMessageSource messageSource;
public void gest(){
messageSource.doSomething() <--- here messageSource …Run Code Online (Sandbox Code Playgroud)