Hibernate 使用复合密钥休眠JPA父子冲突

Hibernate 使用复合密钥休眠JPA父子冲突,hibernate,jpa,Hibernate,Jpa,我在创建父对象和子对象并使用JPA和hibernate一次性将它们持久化到数据库时遇到问题。父类如下所示: @Entity @Table(name = "PUser") public final class User { @Id @Column(name = "ID", unique = true, nullable = false, updatable = false) @GeneratedValue(strategy = GenerationType.AUTO)

我在创建父对象和子对象并使用JPA和hibernate一次性将它们持久化到数据库时遇到问题。父类如下所示:

@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("joe1.bloggs@ft.com", "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("joe1.bloggs@ft.com", "xyz");
    user.setScreenName("joe1bloggs");

    // target is an JpaRepository intergafe
    user = target.saveAndFlush(user);

    user.addAttribute("domain", "name", 212);

    target.saveAndFlush(user);
有人有什么想法吗?或者这只是一个与之共存的例子

谢谢

尼克

EDIT:您可以通过向子类添加@MapsId注释来实现这一点(感谢axtavt的回复)。i、 e.

    @MapsId("userId")
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "userId", nullable = false, insertable = false, updatable = false)
    private User user;

您是否尝试将其映射为以下内容:

@ManyToOne(fetch = FetchType.LAZY)     
@MapsId("userid")
private User user; 

据我所知,在这种情况下,
userid
字段的
AttributePk
应该自动填充
user
的id。

非常感谢,如果我稍微调整一下它,它就可以工作了(参见原始问题中的编辑)