java - 复合标识符的任何部分都不能为空

标签 java hibernate

<分区>

我正在尝试创建一个复合主键映射,但没有成功。

先决条件是:

  • 关系可能是@IdClass注解
  • 我需要与人实体的关系是@ManyToOne

我的代码:

@Entity
@IdClass(PhonePK.class)
public class Phone implements Serializable{
    @Id
    @Column(name = "codigo", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long code;

    @Id
    @ManyToOne
    @JoinColumn(name = "person", referencedColumnName = "code", nullable = false)
    private Person person;

    @Basic
    @Column(name = "number", nullable = false)
    private Integer number;

    //getters and setters
    //equals and hashcode
}

public class PhonePK implements Serializable {
    private Long code;
    private Long person;

    public PhonePK(){}

    public PhonePK(Long code, Long person) {
        this.code = code;
        this.person = person;
    }

    //getters and setters
    //equals and hashcode
}

public class Person implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "code", nullable = false)
    private Long code;

    //getters and setters
    //equals and hashcode
}

他们以我努力坚持的方式:

//a lot of code
//em = Entitymanager
em.persist(person);
phone.setPerson(person);
em.persist(phone);

我收到的错误是:

Caused by: javax.persistence.PersistenceException: org.hibernate.HibernateException: No part of a composite identifier may be null

最佳答案

您在电话实体上设置的人很有可能还没有 ID。坚持不保证和身份。建议您也刷新交易。

相关:ID not added on persis()

关于java - 复合标识符的任何部分都不能为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35521486/

相关文章:

java - 控制台程序的 JNDI 连接池?

java - 隐藏字段的 struts 转义表单验证

java - 如何对列表类型的列表进行排序?

java.lang.NullPointerException 在 sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java :1009)

java - H2 数据库仅在文件中不能在内存中工作

java - Thread.join - 主线程不会恢复执行

java - android 不同宽度的边框

Java Hibernate Projections.sqlGroupProjection 别名

java - 使用 jetty 创建 bean 时出错

java - 将多部分文件插入数据库