【问题标题】:JPA many to many InsertJPA 多对多插入
【发布时间】:2015-08-01 08:26:32
【问题描述】:

我有 3 张桌子。 1 是父母,1 是学生,1 是学生家长。这是家长和学生之间的多对多关系。 parentID 来自父表,studentID 来自学生表。 student_parent 表有 studentID、parentID 和 childRelationship。我需要知道如何使用 JPA(hibernate) 更新 childRelationship 字段。

请注意,我正在使用 Java Spring 和 JPA/Hibernate 来更新我的关系数据库,并且还有其他几个表,但我只想更新 childRelationship 字段。

@Entity
@Table(name = "Student")
@Proxy(lazy = false)
public class Student{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "studentID", nullable = false)
private int studentID;


@Column(name="firstName")
private String firstName;   

@Column(name="middleName")
private String middleName;

@Column(name="lastName")
private String lastName;    

@Column(name="validationID")
private String validationID;

@Column(name="birthDate")
private Date birthDate;

@Column(name="gender")
private char gender;

@Column(name="ethnicity")
private String ethnicity;

@Column(name="photo") // character type has to confirmed
private byte[] photo;

@Column(name="gradeLevel")
private int gradeLevel;

@Column(name="rewardPoints")
private String rewardPoints;

@Column(name="dateCreated")
private Date dateCreated;

@Column(name="schoolID")
private Integer schoolID;

   @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "addressID")
    private Address address;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "userName")
    private UserAccount userAccount;

    @ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
    @JoinTable(name="student_parent",
            joinColumns = {@JoinColumn(name = "studentID")},
            inverseJoinColumns = {@JoinColumn(name = "parentID")})
    private Set<Parent> parents = new HashSet<Parent>();


    @ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
    @JoinTable(name="student_community",
            joinColumns = {@JoinColumn(name = "studentID")},
            inverseJoinColumns = {@JoinColumn(name = "communityID")})
    private Set<Community> communities = new HashSet<Community>();



    //getter and setting

然后是父母。

@Entity
@Proxy(lazy = false)
public class Parent {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int parentID;   

@Column(name="userName")
private String userName;

@Column(name="firstName")
private String firstName;   

@Column(name="middleName")
private String middleName;

@Column(name="lastName")
private String lastName;    

@Column(name="validationID")
private String validationID;

@Column(name="maritalStatus")
private String maritalStatus;

@Column(name="noOfChildren")
private int noOfChildren;

@Column(name="birthDate")
private Date birthDate;

@Column(name="gender")
private char gender;

@Column(name="ethnicity")
private String ethnicity;

@Column(name="annualIncome")
private Float annualIncome;

@Column(name="dateCreated")
private Date dateCreated;

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "addressID")
    private Address address;

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "userName",unique = true, nullable = false, insertable=false, updatable=false)
private UserAccount userAccount;

//getter and setter

【问题讨论】:

  • 由于您使用的是 JPA,因此您使用的是实体。表格无关紧要。我们需要知道的是您的实体的代码、您尝试了什么、您期望它做什么以及它做了什么。

标签: java hibernate jpa many-to-many


【解决方案1】:

你已经有了一个关联表,你需要把它作为一个关联类带入实体世界。关联类的主键是由学生id和父id组成的组合键。不要忘记在主键类上实现 hashcode 和 equals。通过此映射,您可以访问 m:n 关系的属性(即“childRelationship”列)。您还需要添加 getter 和 setter 或使用字段访问权限。

/**
 * Maps to parent table in database
 */
@Entity
class Parent {
    @Id
    long id;

    @OneToMany(mappedBy="parent")
    Set<Relationship> relationships;
}

/**
 * Maps to student table in database
 */
@Entity
class Student {
    @Id
    long id;

    @OneToMany(mappedBy="student")
    Set<Relationship> relationships;
}

/**
 * Encapsulates primary key in relationship table
 */
class RelationshipId {
    long studentId;
    long parentId;

    @Override
    public int hashCode() {
        return ((Long)(studentId + parentId)).hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return obj != null
                && obj instanceof RelationshipId
                && ((RelationshipId)obj).studentId == studentId
                && ((RelationshipId)obj).parentId == parentId;
    }
}

/**
 * Maps to relationship table in database
 */
@Entity
@IdClass(RelationshipId.class)
class Relationship {
    @Id
    @ManyToOne(optional = false)
    @JoinColumn(name="parent")
    Parent parent;

    @Id
    @ManyToOne(optional = false)
    @JoinColumn(name="student")
    Student student;

    @Column
    String childRelationship;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    相关资源
    最近更新 更多