2
我在创建父对象和子对象时遇到了问题,并在使用JPA和休眠的情况下将其持久保存到数据库中。父类看起来像这样:休眠JPA父母与子组合违反父子女
@Entity
@Table(name = "PUser")
public final class User {
@Id
@Column(name = "ID", unique = true, nullable = false, updatable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
}
的子对象使用的化合物键,场是父的ID之一:
@Entity
@Table(name = "PAttribute")
public final class Attribute {
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "domain", column = @Column(name = "domain", nullable = false, length = 128)),
@AttributeOverride(name = "name", column = @Column(name = "name", nullable = false, length = 128)),
@AttributeOverride(name = "userid", column = @Column(name = "userid", nullable = false)) })
private AttributePk pk;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userid", nullable = false, insertable = false, updatable = false)
private User user;
}
复合键类之中:
@Embeddable
public class AttributePk implements java.io.Serializable {
private static final long serialVersionUID = -7003721226789641149L;
@Column(nullable = false, length = 128)
private String domain;
@Column(nullable = false, length = 128)
private String name;
@Column(nullable = false)
private long userid;
}
现在,当我创建一个新用户并添加一个附件,然后尝试保存该对象图时
User user = new User("[email protected]", "xyz");
user.setScreenName("joe1bloggs");
user.addAttribute("domain", "name", 212);
target.saveAndFlush(user);
我得到的异常
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`fta_portal_user/PAttribute`, CONSTRAINT `userId` FOREIGN KEY (`userid`) REFERENCES `PUser` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
显然属性子对象不具有用户对象集的ID。
我知道我可以做以下工作,但看起来很奇怪,我不能仅仅创建一个对象层次结构,并且Hibernate会计划如何设置相应的ID。我怀疑这是没有办法的,因为saveAndFlush()返回一个新的实例,而不仅仅是更新输入参数的版本。
User user = new User("[email protected]", "xyz");
user.setScreenName("joe1bloggs");
// target is an JpaRepository intergafe
user = target.saveAndFlush(user);
user.addAttribute("domain", "name", 212);
target.saveAndFlush(user);
任何人有任何想法,或只是一个生活的情况吗?
感谢
尼克
编辑:您可以得到这个通过添加@MapsId注释子类(感谢axtavt的答复)工作。即
@MapsId("userId")
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userId", nullable = false, insertable = false, updatable = false)
private User user;
非常感谢,如果我稍微调整它,那会有用(请参阅原始问题中的编辑) – nickcodefresh