View Full Version : سوال: Mapping در JPA
L u k e
پنج شنبه 25 فروردین 1390, 20:58 عصر
می خوام 2 تا Table رو تو Jpa بهم وصل کنم نمی تونم
گیج شدم
یه رابطه One To Many هست
فرض کنید 2 تا جدول داریم
یه جدول School :
ID
Name
جدول Student :
ID
FullName
Age
School_ID
حالا اینا رو می خوام بهم وصل کنم چطوری ه ؟
L u k e
پنج شنبه 25 فروردین 1390, 21:02 عصر
این کلاس ا مه مشکلش کجاش ؟
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Entity;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MapKey;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
*
* @author Mohsen
*/
@Entity
@Table(name = "school")
@NamedQueries({
@NamedQuery(name = "School.findAll", query = "SELECT s FROM School s")})
public class School implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "ID")
private Integer id;
@Column(name = "Name")
private String name;
@OneToMany(mappedBy = "School")
@MapKey(name = "SchoolID")
private List<Student> students;
public School() {
}
public School(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof School)) {
return false;
}
School other = (School) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "Entity.School[id=" + id + "]";
}
}
@Entity
@Table(name = "student")
@NamedQueries({
@NamedQuery(name = "Student.findAll", query = "SELECT s FROM Student s")})
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "ID")
private Integer id;
@Column(name = "FullName")
private String fullName;
@Column(name = "Age")
private Integer age;
public Student() {
}
public Student(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Student)) {
return false;
}
Student other = (Student) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "Entity.Student[id=" + id + "]";
}
}
javaphantom
جمعه 26 فروردین 1390, 00:11 صبح
مشکل کار اینه که کتاب نمی خونی. فقط می خوای از طریق چند خط کد کارت راه بی افته. به قول قدیمی ها یا پیرهای امروزی تجربه کنی. یا به جمله معروف تجربه بهتر از علم هست عمل کنی. اینم نتیجشه.
اما راه حل
@Entity
public class School implements Serializable {
@Id
private Integer schoolId;
private String name;
@OneToMany(mappedBy ="school" )
private List<Student> students;
}
@Entity
public class Student implements Serializable {
@Id
private Integer studentId;
private String name;
@ManyToOne
@JoinColumn(name = "school_ref_id",referencedColumnName = "schoolId")
private School school;
}
getter and setter هاشم خودت درست کن اگر زحمتتون نمی شه.
L u k e
جمعه 26 فروردین 1390, 19:25 عصر
بابا خیلی ایول داری
موقع Insert این مدلی Error می ده ولی تکی می شه Insert کرد :
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("TutorialJPA");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
School sch = new School();
sch.setName("Khaje Nasir");
Student stu = new Student();
stu.setAge(17);
stu.setFullName("Mohsen Karimi");
sch.addStudents(stu);
em.persist(sch);
em.getTransaction().commit();
em.close();
emf.close();
}خطاش اینه :
run:
[EL Info]: 2011-04-15 19:51:49.327--ServerSession(16607409)--EclipseLink, version: Eclipse Persistence Services - 2.0.2.v20100323-r6872
[EL Info]: 2011-04-15 19:51:49.846--ServerSession(16607409)--file:/D:/Mo$eN/Project/TestJPA/src/_TutorialJPA login successful
Exception in thread "main" javax.persistence.RollbackException: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: Entity.Student[id=null].
[EL Warning]: 2011-04-15 19:51:49.941--UnitOfWork(26980954)--java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: Entity.Student[id=null].
at org.eclipse.persistence.internal.jpa.transaction.E ntityTransactionImpl.commitInternal(EntityTransact ionImpl.java:102)
at org.eclipse.persistence.internal.jpa.transaction.E ntityTransactionImpl.commit(EntityTransactionImpl. java:63)
at testjpa.Main.main(Main.java:35)
Caused by: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: Entity.Student[id=null].
at org.eclipse.persistence.internal.sessions.UnitOfWo rkImpl.discoverAndPersistUnregisteredNewObjects(Un itOfWorkImpl.java:4160)
at org.eclipse.persistence.mappings.CollectionMapping .cascadeDiscoverAndPersistUnregisteredNewObjects(C ollectionMapping.java:358)
at org.eclipse.persistence.internal.descriptors.Objec tBuilder.cascadeDiscoverAndPersistUnregisteredNewO bjects(ObjectBuilder.java:1540)
at org.eclipse.persistence.internal.sessions.UnitOfWo rkImpl.discoverAndPersistUnregisteredNewObjects(Un itOfWorkImpl.java:4163)
at org.eclipse.persistence.internal.sessions.Repeatab leWriteUnitOfWork.discoverUnregisteredNewObjects(R epeatableWriteUnitOfWork.java:225)
at org.eclipse.persistence.internal.sessions.UnitOfWo rkImpl.calculateChanges(UnitOfWorkImpl.java:699)
at org.eclipse.persistence.internal.sessions.UnitOfWo rkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImp l.java:1503)
at org.eclipse.persistence.internal.sessions.Repeatab leWriteUnitOfWork.commitRootUnitOfWork(RepeatableW riteUnitOfWork.java:200)
at org.eclipse.persistence.internal.sessions.UnitOfWo rkImpl.commitAndResume(UnitOfWorkImpl.java:1139)
at org.eclipse.persistence.internal.jpa.transaction.E ntityTransactionImpl.commitInternal(EntityTransact ionImpl.java:84)
... 2 more
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)
javaphantom
شنبه 27 فروردین 1390, 12:25 عصر
@Entity
@Table(name = "school", schema = "test")
public class School {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer schoolId;
private String name;
@OneToMany(mappedBy = "school",fetch = FetchType.LAZY,cascade = CascadeType.ALL)
private List<Student> students;
public Integer getSchoolId() {
return schoolId;
}
public void setSchoolId(Integer schoolId) {
this.schoolId = schoolId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
L u k e
دوشنبه 29 فروردین 1390, 08:29 صبح
خیلی سروکله باش ولی بازم درست نشد
javaphantom
دوشنبه 29 فروردین 1390, 09:45 صبح
خیلی سروکله باش ولی بازم درست نشد
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
*
* @author azarmi
*/
@Entity
@Table(name = "school", catalog = "babak", schema = "")
@NamedQueries({
@NamedQuery(name = "School.findAll", query = "SELECT s FROM School s"),
@NamedQuery(name = "School.findBySchoolId", query = "SELECT s FROM School s WHERE s.schoolId = :schoolId"),
@NamedQuery(name = "School.findBySchoolName", query = "SELECT s FROM School s WHERE s.schoolName = :schoolName")})
public class School implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "school_id", nullable = false)
private Integer schoolId;
@Basic(optional = false)
@Column(name = "school_name", nullable = false, length = 45)
private String schoolName;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "school")
private Collection<Student> studentCollection;
public School() {
}
public School(Integer schoolId) {
this.schoolId = schoolId;
}
public School(Integer schoolId, String schoolName) {
this.schoolId = schoolId;
this.schoolName = schoolName;
}
public Integer getSchoolId() {
return schoolId;
}
public void setSchoolId(Integer schoolId) {
this.schoolId = schoolId;
}
public String getSchoolName() {
return schoolName;
}
public void setSchoolName(String schoolName) {
this.schoolName = schoolName;
}
public Collection<Student> getStudentCollection() {
return studentCollection;
}
public void setStudentCollection(Collection<Student> studentCollection) {
this.studentCollection = studentCollection;
}
@Override
public int hashCode() {
int hash = 0;
hash += (schoolId != null ? schoolId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof School)) {
return false;
}
School other = (School) object;
if ((this.schoolId == null && other.schoolId != null) || (this.schoolId != null && !this.schoolId.equals(other.schoolId))) {
return false;
}
return true;
}
@Override
public String toString() {
return "javaapplication5.School[schoolId=" + schoolId + "]";
}
}
import javax.persistence.*;
import java.io.Serializable;
/**
* @author azarmi
*/
@Entity
@Table(name = "student", catalog = "babak", schema = "")
@NamedQueries({
@NamedQuery(name = "Student.findAll", query = "SELECT s FROM Student s"),
@NamedQuery(name = "Student.findByStudentId", query = "SELECT s FROM Student s WHERE s.studentId = :studentId"),
@NamedQuery(name = "Student.findByStudentName", query = "SELECT s FROM Student s WHERE s.studentName = :studentName")})
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "student_id", nullable = false)
private Integer studentId;
@Basic(optional = false)
@Column(name = "student_name", nullable = false, length = 45)
private String studentName;
@JoinColumn(name = "school_ref", referencedColumnName = "school_id", nullable = false)
@ManyToOne(optional = false)
private School school;
public Student() {
}
public Student(Integer studentId) {
this.studentId = studentId;
}
public Student(Integer studentId, String studentName) {
this.studentId = studentId;
this.studentName = studentName;
}
public Integer getStudentId() {
return studentId;
}
public void setStudentId(Integer studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public School getSchool() {
return school;
}
public void setSchool(School school) {
this.school = school;
}
@Override
public int hashCode() {
int hash = 0;
hash += (studentId != null ? studentId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Student)) {
return false;
}
Student other = (Student) object;
if ((this.studentId == null && other.studentId != null) || (this.studentId != null && !this.studentId.equals(other.studentId))) {
return false;
}
return true;
}
@Override
public String toString() {
return "javaapplication5.Student[studentId=" + studentId + "]";
}
}
L u k e
دوشنبه 29 فروردین 1390, 16:21 عصر
خوب تقریبا درست شد ولی وقتی یه Student ای رو School شو ست نمی کنی null می زنه SchoolD شو تو DB
یعنی اینجوری ( فکر نکنم که اینجوری باشه باید خودش بفهمه پدرش کیه دیگه ؟ )
School sch = new School();
List<Student> students = new ArrayList<Student>();
sch.setName("Alame Dehkhoda");
Student stu = new Student();
stu.setAge(17);
stu.setFullName("Hasan Karimi");
inja ro migam bayad bashe ya na ?<----- stu.setSchool(sch);
students.add(stu);
sch.setStudents(students);
em.persist(sch);
بعد یه چیزی این قسمت Join Columns خاصیت Name که اسم فیلد تو Table که همون School_ID ه refrencedColumnName چیه قزیش ؟
بعد Name رو چرا گذاشتید School_Ref اصلا از کجا آوردینش ؟
بعدشم واقعا ممنونم خیلی عذتییون کردم
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.