2012-09-12 65 views
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; 

回答

1

您是否尝试过如下图吧:

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

至于我在这种情况下useridAttributePk领域的理解应与user的ID自动填充。

+0

非常感谢,如果我稍微调整它,那会有用(请参阅原始问题中的编辑) – nickcodefresh