假设我有 2 个 JPA 实体
@Entity
public class MyComplexEntity implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
@GeneratedValue(strategy = GenerationType.IDENTITY)
private MyComplexEntityId id;
private String text;
public MyComplexEntity() {
}
public MyComplexEntity(String text) {
this.text = text;
}
public MyComplexEntityId getId() {
return id;
}
public void setId(MyComplexEntityId id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
@Override
public String toString() {
return "MyComplexEntity{" + "id=" + id + ", text=" + text + '}';
}
}
和
@Embeddable
public class MyComplexEntityId {
@Column
private long id;
public MyComplexEntityId(long id) {
this.id = id;
}
public MyComplexEntityId() {
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Override
public String toString() {
return "MyComplexEntityId{" + "id=" + id + '}';
}
}
现在我正在尝试像这样持久化一个新的 MyComplexEntity 对象
MyComplexEntity entity = new MyComplexEntity("something");
em.persist(entity);
System.out.println(entity);
我得到的是:
MyComplexEntity{id=null, text=something}
为什么那里的 id 为空?如果我对原始主键类型做同样的事情,则在持久化后正确设置了 id。我还尝试了以下事情:
- 在坚持后调用
em.flush();
:什么都不做 - 在持久化之后调用
em.refresh(entity);
:异常告诉我实体不再在数据库中(这是错误的) - 尝试
em.merge()
代替em.persist()
:与预期相同的结果 - 调用
em.contains(entity);
返回true,所以实体实际上是附加的 em.persist();
通过使用在单独的方法中执行它来将其放入单独的事务中@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
persist() 一定有某种问题;使用@EmbeddedId 时,但我就是不明白。