2
你將如何實現其中的抽象超A有2子類,B型號和C B具有與其他類X.休眠加入子類具有一對多映射
我一個雙向一個一對多的關係我正在使用沒有鑑別器和anotaions(無xml)的聯合子類映射。 它的工作原理幾乎完美,但來自B的ID在X類中爲null。 X類可以從超類中獲取ID嗎?抑或是尋找一個ID在B.
超類
import javax.persistence.*;
import org.hibernate.annotations.Cascade;
@Entity
@Table(name="t_trip")
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Trip {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private int id;
private String name;
private boolean publicTrip;
private String description;
public Trip(){
}
public Trip(String name, String description, boolean publicTrip) {
this.name = name;
this.description = description;
this.publicTrip = publicTrip;
}
}
子類乙
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import org.hibernate.annotations.Cascade;
@Entity
@Table(name = "t_repeatedtrip")
@PrimaryKeyJoinColumn(name = "id")
public class RepeatedTrip extends Trip {
private Date startMoment;
private String intervalType;
private int tripInterval;
private int tripFrequency;
@OneToMany(mappedBy = "repeatedTrip")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
private List<TripExecutionMoment> tripExecutionMoments = new ArrayList<TripExecutionMoment>();
public RepeatedTrip() {
}
public RepeatedTrip(String name, String description,boolean publicTrip, Date startMoment,
String intervalType, int interval, int frequency) {
super(name, description, publicTrip);
this.startMoment = startMoment;
this.intervalType = intervalType;
this.tripInterval = interval;
this.tripFrequency = frequency;
}
}
一對多相關類X
package be.kdg.teamB.model.entities;
import java.util.Date;
import javax.persistence.*;
import org.hibernate.annotations.Cascade;
@Entity
@Table(name = "t_tripexecutionmoment")
public class TripExecutionMoment {
@Id
@GeneratedValue
private int id;
private Date executionPointOfTime;
@ManyToOne
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
@JoinColumn(name = "repeatedTripId")
private RepeatedTrip repeatedTrip;
public TripExecutionMoment() {
}
public TripExecutionMoment(Date executionPointOfTime) {
this.executionPointOfTime = executionPointOfTime;
}
return executionPointOfTime;
}
public void setExecutionPointOfTime(Date executionPointOfTime) {
this.executionPointOfTime = executionPointOfTime;
}
public RepeatedTrip getRepeatedTrip() {
return repeatedTrip;
}
public void setRepeatedTrip(RepeatedTrip repeatedTrip) {
this.repeatedTrip = repeatedTrip;
}
}
代碼被稱爲在這個方法:
public RepeatedTrip createRepeatedTrip(String name, String description,boolean publicTrip,
Date startMoment, String intervalType, int interval,
int frequency) {
session = HibernateUtil.getSessionFactory().getCurrentSession();
tx = session.beginTransaction();
RepeatedTrip trip = new RepeatedTrip(name, description,publicTrip, startMoment,
intervalType, interval, frequency);
int intervalDefiner;
Date date = trip.getStartMoment();
switch(intervalType){
case "D":
intervalDefiner = Calendar.DATE;
break;
case "M":
intervalDefiner = Calendar.MONTH;
break;
case "W":
intervalDefiner = Calendar.WEEK_OF_YEAR;
break;
case "Y":
intervalDefiner = Calendar.YEAR;
break;
default:
intervalDefiner = Calendar.DATE;
break;
}
for(int i=0; i<frequency;i++){
TripExecutionMoment tripExecutionMoment = new TripExecutionMoment(date);
trip.getTripExecutionMoments().add(tripExecutionMoment);
date = nextDate(intervalDefiner, interval, date);
}
session.saveOrUpdate(trip);
tx.commit();
return trip;
}
向我們展示你的代碼。你可能忘了初始化'X.b'字段。 – 2013-02-08 17:30:27
感謝您的回覆。我添加了我的代碼(沒有setter和getters,我擁有所有字段)。我應該如何初始化X.b?我不完全明白你的意思。 – Charlie 2013-02-08 18:03:41
但是你不顯示最有趣的部分。向我們展示您用於創建TripExecutionMoment並將其添加到RepeatedTrip的代碼。 – 2013-02-08 18:07:02