Hibernate JPA IdentifierGenerationException: null id generated for class with @embeddedid

后端 未结 3 1669
迷失自我
迷失自我 2021-01-12 19:21

I am having trouble mapping my database domain model to the program entities in one case where the entity is essentially a join table (a period) which combines two other ent

相关标签:
3条回答
  • 2021-01-12 19:30

    On a first glance, You're missing the generated value annotation in the embedded id class.

    @Embeddable
    public class PeriodId implements Serializable {
    
        @GeneratedValue
        @Column(name = "timeslot_idtimeslot")
        private int timeslotId;
    
        @GeneratedValue    
        @Column(name = "day_idday")
        private int dayId;
    
        //constructors, getters, setters, hashcode, and equals
    }
    
    0 讨论(0)
  • 2021-01-12 19:35

    I was able to create the following mapping for my case (scala code) and could totally throw away the @Embeddable class:

    @Entity
    @Table(name = "payment_order_item", schema = "pg")
    @IdClass(classOf[PaymentOrderItem])
    final class PaymentOrderItem extends Serializable{
    
      @Id
      @ManyToOne
      @JoinColumn(name = "order_item_id", referencedColumnName = "id")
      var orderItem: OrderItem = _
    
      @Id
      @ManyToOne
      @JoinColumn(name = "payment_id", referencedColumnName = "id")
      var payment: Payment = _
    }
    

    So the following should work for you then

    @Entity
    @Table(name = "period")
    @IdClass(Period.class)
    public class Period extends Serializable{
    
        @Id
        @ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "day_idday", referencedColumnName = "id", nullable = false)
        private Day day;
    
        @Id
        @ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "timeslot_idtimeslot", referencedColumnName = "id", nullable = false)
        private Timeslot timeslot;
    
        //constructors, getters, setters, hashcode, and equals
    }
    
    0 讨论(0)
  • 2021-01-12 19:46

    Put those guys

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "day_idday", nullable = false, insertable = false, updatable = false)
    private Day day;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "timeslot_idtimeslot", nullable = false, insertable = false, updatable = false)
    private Timeslot timeslot;
    

    inside the PeriodId class and throw away those ints. I have done a mapping similar to yours this way and it works.

    0 讨论(0)
提交回复
热议问题