2

I am persisting two tables,User and DistrictUser using Hibernate.User Table has a composite PK UserPK.

why the resultant table DistrictUser is same for both @PrimaryKeyJoinColumn and @PrimaryKeyJoinColumns?

why the columns names in DistrictUser are prepended with "user_" while using @PrimaryKeyJoinColumn or @PrimaryKeyJoinColumns when I have explicitly mentioned the name in the "name" attribute in the annotation?

@Entity
@Table(name = "DistrictUser")
public class DistrictUser {

    @Id
    @Column(name = "ID_KEY")
    private Long id;


@ManyToOne(cascade = CascadeType.ALL)
@JoinColumns( { @JoinColumn(name = "USERS_KEY", referencedColumnName="USERS_KEY"),
@JoinColumn(name = "BEGIN_DATE", referencedColumnName="START_DATE"),
@JoinColumn(name = "END_DATE", referencedColumnName="END_DATE") })
private User user;

//    @PrimaryKeyJoinColumns({
//        @PrimaryKeyJoinColumn(name = "START_DATE", referencedColumnName = "START_DATE"),
//        @PrimaryKeyJoinColumn(name = "END_DATE", referencedColumnName = "END_DATE"),
//        @PrimaryKeyJoinColumn(name = "USERS_KEY", referencedColumnName = "USERS_KEY")})
//    @ManyToOne()
//    private User user;


//@PrimaryKeyJoinColumn(name = "START_DATE", referencedColumnName = "START_DATE")
// @ManyToOne()
//    private User user;

//getters and setters
}

@Entity
@Table(name = "USERS")
@IdClass(UserPK.class)
public class User 
{
@Id
@Column(name = "USERS_KEY")
private Long userKey;

@Id
@Column(name = "START_DATE")

@Temporal(javax.persistence.TemporalType.DATE)
private Date startDate;

@Id
@Column(name = "END_DATE")
@Temporal(javax.persistence.TemporalType.DATE)
private Date endDate;
//getters and setters

}

public class UserPK implements Serializable {
private static final long serialVersionUID = -7720874756224520523L;

private Long userKey;

private Date startDate;

private Date endDate;
//getters and setters
}

code to persist the tables

        User user = new User();
        user.setStartDate(new Date());
        user.setEndDate(new Date());
        user.setUserKey(1l);

        DistrictUser du = new DistrictUser();
        du.setId(10l);
        du.setUser(user);

        session.save(user);
        session.save(du);
        session.flush();
        session.getTransaction().commit();
        session.close();

When JoinColumns is used DistrictUser table is

@ManyToOne(cascade = CascadeType.ALL)
    @JoinColumns( { @JoinColumn(name = "USERS_KEY", referencedColumnName="USERS_KEY"),
    @JoinColumn(name = "BEGIN_DATE", referencedColumnName="START_DATE"),
    @JoinColumn(name = "END_DATE", referencedColumnName="END_DATE") })
    private User user;

enter image description here

When @PrimaryKeyJoinColumn is used by uncommenting the relative code DistrictUser

@PrimaryKeyJoinColumn(name = "START_DATE", referencedColumnName = "START_DATE")
     @ManyToOne()
     private User user;

enter image description here

When @PrimaryKeyJoinColumns is used by uncommenting the relative code in DistrictUser

 @PrimaryKeyJoinColumns({
   @PrimaryKeyJoinColumn(name = "START_DATE", referencedColumnName = "START_DATE"),
   @PrimaryKeyJoinColumn(name = "END_DATE", referencedColumnName = "END_DATE"),
   @PrimaryKeyJoinColumn(name = "USERS_KEY", referencedColumnName = "USERS_KEY")})
   @ManyToOne()
    private User user;

enter image description here

Could someone point out the differences between the three approaches

Sameer
  • 41
  • 4
  • Does this answer your question? [JPA: difference between @JoinColumn and @PrimaryKeyJoinColumn?](https://stackoverflow.com/questions/3417097/jpa-difference-between-joincolumn-and-primarykeyjoincolumn) – reconov May 01 '22 at 04:55

0 Answers0