Java Hibernate中的连接表和OneToMany关系
我为表HOBBY和STUDENT创建了两个实体,但是我很难从联接表中检索所需的信息 这是模式:Java Hibernate中的连接表和OneToMany关系,java,sql,hibernate,join,dao,Java,Sql,Hibernate,Join,Dao,我为表HOBBY和STUDENT创建了两个实体,但是我很难从联接表中检索所需的信息 这是模式: STUDENT STUDENT_HOBBY HOBBY -------- ----------- -------- id ------------------ student_id name hobby_id ---------- id lastname
STUDENT STUDENT_HOBBY HOBBY
-------- ----------- --------
id ------------------ student_id
name hobby_id ---------- id
lastname hobby_name
--------- ---------- --------
where
Student to student_hobby = one to many
Hobby to student_hobby = one to many
(that means a student may have many hobbies and a hobby can belong to more than one student)
这是学生实体类:
@Entity
@Table(name="STUDENT")
public class Student {
@OneToMany
@JoinTable(name="student_hobbies", joinColumns=@JoinColumn(name="student_id"),
inverseJoinColumns=@JoinColumn(name="hobby_id"))
private Collection<Hobby> hobbies;
@Id
@Column(name="ID")
@GeneratedValue
private Integer id;
@Column(name="NAME")
private String name;
@Column(name="LASTNAME")
private String lastName;
// Getters and setters here
}
@Entity
@Table(name="HOBBY")
public class Hobby {
@OneToMany
@JoinTable(name="student_hobbies", joinColumns=@JoinColumn(name="hobby_id"),
inverseJoinColumns=@JoinColumn(name="student_id"))
private Collection<Student> students;
@Id
@Column(name="ID")
@GeneratedValue
private Integer id;
@Column(name="HOBBY_NAME")
private String hobby_name;
// Getters and setters here
}
我是否应该为联接表创建其他实体类?有人能给我一些指示吗?您可以为联接表创建一个实体类,但您不需要也不应该这样做。这只会创建更多要维护的代码。如果联接表中有需要查询的数据,则应为联接表创建一个实体。如果联接表中有开始时间或其他内容,并且您希望能够看到开始时间
在避免连接表实体时,应该使用注释。我链接到的文档提供了一些很好的示例,说明了如何做到这一点:
Example 1:
// In Customer class:
@ManyToMany
@JoinTable(name="CUST_PHONES")
public Set<PhoneNumber> getPhones() { return phones; }
// In PhoneNumber class:
@ManyToMany(mappedBy="phones")
public Set<Customer> getCustomers() { return customers; }
Example 2:
// In Customer class:
@ManyToMany(targetEntity=com.example.PhoneNumber.class)
public Set getPhones() { return phones; }
// In PhoneNumber class:
@ManyToMany(targetEntity=com.example.Customer.class, mappedBy="phones")
public Set getCustomers() { return customers; }
Example 3:
// In Customer class:
@ManyToMany
@JoinTable(name="CUST_PHONE",
joinColumns=
@JoinColumn(name="CUST_ID", referencedColumnName="ID"),
inverseJoinColumns=
@JoinColumn(name="PHONE_ID", referencedColumnName="ID")
)
public Set<PhoneNumber> getPhones() { return phones; }
// In PhoneNumberClass:
@ManyToMany(mappedBy="phones")
public Set<Customer> getCustomers() { return customers; }
示例1:
//在客户类别中:
@许多
@JoinTable(name=“客户电话”)
公共设置getPhones(){return phones;}
//在PhoneNumber类中:
@许多(mappedBy=“电话”)
公共集getCustomers(){return customers;}
例2:
//在客户类别中:
@ManyToMany(targetEntity=com.example.PhoneNumber.class)
公共设置getPhones(){return phones;}
//在PhoneNumber类中:
@ManyToMany(targetEntity=com.example.Customer.class,mappedBy=“phones”)
公共集getCustomers(){return customers;}
例3:
//在客户类别中:
@许多
@JoinTable(name=“客户电话”,
连接柱=
@JoinColumn(name=“CUST\u ID”,referencedColumnName=“ID”),
反向连接柱=
@JoinColumn(name=“PHONE\u ID”,referencedColumnName=“ID”)
)
公共设置getPhones(){return phones;}
//在PhoneNumberClass中:
@许多(mappedBy=“电话”)
公共集getCustomers(){return customers;}
Example 1:
// In Customer class:
@ManyToMany
@JoinTable(name="CUST_PHONES")
public Set<PhoneNumber> getPhones() { return phones; }
// In PhoneNumber class:
@ManyToMany(mappedBy="phones")
public Set<Customer> getCustomers() { return customers; }
Example 2:
// In Customer class:
@ManyToMany(targetEntity=com.example.PhoneNumber.class)
public Set getPhones() { return phones; }
// In PhoneNumber class:
@ManyToMany(targetEntity=com.example.Customer.class, mappedBy="phones")
public Set getCustomers() { return customers; }
Example 3:
// In Customer class:
@ManyToMany
@JoinTable(name="CUST_PHONE",
joinColumns=
@JoinColumn(name="CUST_ID", referencedColumnName="ID"),
inverseJoinColumns=
@JoinColumn(name="PHONE_ID", referencedColumnName="ID")
)
public Set<PhoneNumber> getPhones() { return phones; }
// In PhoneNumberClass:
@ManyToMany(mappedBy="phones")
public Set<Customer> getCustomers() { return customers; }