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
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
}
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
}
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.