我有一个简单的JPA实体,它使用生成的long"ID"作为其主键:
@Entity
public class Player {
private long id;
protected Player() {
// Do nothing; id defaults to 0L
}
@GeneratedValue
@Id
public long getId() {
return id;
}
protected void setId(final long id) {
this.id = id;
}
// Other code
}
Run Code Online (Sandbox Code Playgroud)
在此类对象的生命周期中的某个时刻,JPA必须调用setId()以记录生成的ID值.我的问题是,这是什么时候发生的,以及说明这一点的文档在哪里.我查看了JPA规范,但找不到明确的声明.
JPA规范说(重点补充):
托管实体实例是具有持久标识的实例,该标识当前与持久性上下文相关联.
这是否试图说必须管理对象具有@Id重要意义?说明EntityManager.persist()(强调添加)的文档使"实例管理和持久",这是否意味着@Id由该方法设置?或者直到你打电话EntityTransaction.commit()?
当@Id设置可能是不同的JPA提供商不同,也许不同的生成策略.但是,最安全(可移植,符合规范)的假设是什么,你可以在生命周期的最早点设置它?
对于每个@Entity,我需要执行以下操作:
public <Entity> boolean insert(final Entity entity){
if (em.find(entity.getClass(), entity.getId()) == null) {
et.begin();
em.persist(entity);
et.commit();
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
如果实体不存在,那就是持久存在,并知道它是否存在.有了实体,我正试图到达@Entity,虽然我意识到这不是继承关系.我可以用什么类来引用每个JPA实体?我可以创建一个接口/抽象类MyEntities并让所有这些继承,但是这样吗?我希望减少代码.此外,当我尝试使用.getId()时,我希望能够提取每个实体的主键.
我有一张桌子
CREATE TABLE `SomeEntity` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`subid` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`,`subid`),
Run Code Online (Sandbox Code Playgroud)
我有一个实体类,其中包含一个自动增量字段.我希望在持久化时读取分配给它的自动增量ID
getter上的注释如下
private long id;
private int subid;
@Id
@GeneratedValue **//How do i correct this to have multiple rows with same id and different subid**
@Column(name = "id")
public long getId() {
return id;
}
@Id
@Column(name = "subid")
public int getSubid() {
return subid;
}
Run Code Online (Sandbox Code Playgroud)
我希望有实体
id 1 subid 0
id 1 subid 1
id 1 subid 2
id 2 …Run Code Online (Sandbox Code Playgroud)