2016-11-25 60 views
1

我有我的JPA的一個問題。 基本上我的信使是由程序創建的,客戶和包裹是用戶在運行時創建的。當我嘗試添加新宗地時,將對象添加到客戶中的宗地列表和Courier中的宗地列表中。但嘗試添加到Courier包裹列表時它崩潰。我打電話給我的菜單中的主類問題與一對多的關係Java的JPA

之前創建一個快遞對象,並引發以下錯誤: 在同步的新對象是通過沒有標記級聯關係找到PERSIST:快遞: ID:0 名稱:null Vehicle:null。

這是我的代碼:

@Entity 
    @SequenceGenerator(name="cou_seq", initialValue=1, allocationSize=1) 

    @SuppressWarnings("SerializableClass") 
    public class Courier implements Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="cou_seq") 
private int couId; 
private String name; 
private String vehicle; 

@OneToMany(mappedBy = "courier", cascade = CascadeType.PERSIST) 
private List<Parcel> plist = new ArrayList<>(); 

public Courier(){ 
} 

public Courier(String nameIn, String vehicleIn){ 
    name = nameIn; 
    vehicle = vehicleIn; 
} 

public void addParcel(Parcel p1){ 
    plist.add(p1); 
    p1.setCo(this); 
} 

public int getCouId() { 
    return couId; 
} 

public String getName() { 
    return name; 
} 

public String getVehicle() { 
    return vehicle; 
} 

public void setCouId(int couId) { 
    this.couId = couId; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public void setVehicle(String vehicle) { 
    this.vehicle = vehicle; 
} 

public List<Parcel> getParcel(){ 
    return plist; 
} 

public void setParcel(List<Parcel> parcels) { 
    plist = parcels; 
} 
@Override 
public String toString(){ 
    return "Courier: \nId: " + couId + "\nName: " + name + "\nVehicle: " + vehicle; 
} 

// Customer類

@Entity 
    @SequenceGenerator(name="cus_seq", initialValue=1, allocationSize=1) 

    @SuppressWarnings("SeralizableClass") 
    public class Customer implements Serializable { 
@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="cus_seq") 
private int cusId; 
private String login; 
private String password; 
private String fname; 
private String lname; 
private String dob; 
private String address; 
private String phoneNo; 
private String email; 

@OneToMany(mappedBy = "customer") 
private List<Parcel> plist = new ArrayList<>(); 


public Customer(){ 
} 

public Customer(String loginIn, String passwordIn, String fnameIn, String lnameIn, String dobIn, String addressIn, String phoneNoIn, String emailIn){ 
    login = loginIn; 
    password = passwordIn; 
    fname = fnameIn; 
    lname = lnameIn; 
    dob = dobIn; 
    address = addressIn; 
    phoneNo = phoneNoIn; 
    email = emailIn; 
} 

public void addParcel(Parcel p) { 
    plist.add(p); 
    p.setC(this); 
} 

public String getFname() { 
    return fname; 
} 

public String getLname() { 
    return lname; 
} 

public String getDob() { 
    return dob; 
} 

public String getAddress() { 
    return address; 
} 

public String getPhoneNo() { 
    return phoneNo; 
} 

public String getEmail() { 
    return email; 
} 

public void setFname(String fname) { 
    this.fname = fname; 
} 

public void setLname(String lname) { 
    this.lname = lname; 
} 

public void setDob(String dob) { 
    this.dob = dob; 
} 

public void setAddress(String address) { 
    this.address = address; 
} 

public void setPhoneNo(String phoneNo) { 
    this.phoneNo = phoneNo; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

public List<Parcel> getParcel(){ 
    return plist; 
} 

public void setParcel(List<Parcel> parcels) { 
    plist = parcels; 
} 

public String toString(){ 
    return "Customer: " + "\nID: " + cusId + "\nLogin: " + login + "\nFirst Name: " + fname + "\nSecond Name: " + lname + "\nDOB: " + dob + "\nAddress: " + address + "\nPhone No: " + phoneNo; 
} 

}

//包裹類

@Entity 
    @Inheritance(strategy = InheritanceType.JOINED) 
    @DiscriminatorColumn(name = "type") 
    @SequenceGenerator(name = "par_seq", initialValue = 1, allocationSize =  1) 

    @SuppressWarnings("SerializableClass") 
    public class Parcel { 

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "par_seq") 
private int parId; 
private double height; 
private double width; 
private double length; 
private double weight; 
private String receiver; 

@ManyToOne() 
@JoinColumn(name = "cuId") 
private Customer customer; 

@ManyToOne() 
@JoinColumn(name = "coId") 
private Courier courier; 

private static double price; 

public Parcel() { 
} 

public Parcel(double heightIn, double widthIn, double lengthIn, double weightIn, String receiverIn) { 
    height = heightIn; 
    width = widthIn; 
    length = lengthIn; 
    weight = weightIn; 
    receiver = receiverIn; 
} 

public double getHeight() { 
    return height; 
} 

public double getWidth() { 
    return width; 
} 

public double getLength() { 
    return length; 
} 

public double getWeight() { 
    return weight; 
} 

public double getPrice() { 
    return price; 
} 

public void setHeight(double height) { 
    this.height = height; 
} 

public void setWidth(double width) { 
    this.width = width; 
} 

public void setLength(double length) { 
    this.length = length; 
} 

public void setWeight(double weight) { 
    this.weight = weight; 
} 

public void setPrice(double price) { 
    this.price = price; 
} 

public double calcSize(double height, double width, double length) { 
    return height * width * length; 
} 

public void setC(Customer c) { 
    this.customer = c; 
} 

public Customer getC() { 
    return customer; 
} 

public void setCo(Courier c1) { 
    this.courier = c1; 
} 

public Courier getCo() { 
    return courier; 
} 

@Override 
public String toString() { 
    return "Parcel:\nHeight: " + height + "\nWidth: " + width + "\nLength: " + length + "\nWeight: " + weight; 
} 

}

// JPA方法,增加了一個新的包裹

public Parcel createParcel(double heightAdd, double widthAdd, double  lengthAdd, double weightAdd, String receiverAdd,String owner,String type){ 
    int id = findCustomerIdByLogin(owner); 
    Customer c = em.find(Customer.class, id); 
    Courier co = new Courier(); 
    em.getTransaction().begin(); 
    if(type.equals("INT")){ 
     System.out.println("Inside here"); 
     InternationalParcel int1 = new InternationalParcel(heightAdd, widthAdd, lengthAdd, weightAdd, receiverAdd); 
     em.persist(int1); 
     c.addParcel(int1); 
     //em.persist(int1); 
     co.addParcel(int1); 
     em.getTransaction().commit(); 
     return int1; 
    } else { 
     NationalParcel nat1 = new NationalParcel(heightAdd, widthAdd, lengthAdd, weightAdd,receiverAdd); 
     em.persist(nat1); 
     c.addParcel(nat1); 
     em.persist(nat1); 
     co.addParcel(nat1); 
     em.getTransaction().commit(); 
     return nat1; 
    } 

}

+1

歡迎進入SO!你能否修正你的源代碼的縮進,並且可能將其解決到你的問題的核心?這是許多源代碼可供閱讀,如果他們更容易找出解決方案的問題,人們更可能幫助您。 –

回答

0

你加入你的包裹快遞未在數據庫堅持呢。

你必須堅持你的快遞對象爲好。

既然你說你的快遞對象,它應該堅持級聯的地塊對象它實際上應該是不夠的,只是堅持的Courer不會對自己的堅持每件包裹:

Parcel parcel; 
Customer c = em.find(Customer.class, id); 
Courier co = new Courier(); 
em.getTransaction().begin(); 
if(type.equals("INT")){ 
    parcel = new InternationalParcel(heightAdd, widthAdd, lengthAdd, weightAdd, receiverAdd); 
} else { 
    parcel = new NationalParcel(heightAdd, widthAdd, lengthAdd, weightAdd,receiverAdd); 
} 
co.addParcel(parcel); 
em.persist(co); // <- This is what you are currently not doing! 
em.persist(parcel); // <- this might not be necessary because of cascade persist 
c.addParcel(parcel); 
em.getTransaction().commit(); 
return parcel;