2016-11-25 2 views
1

У меня проблема с моей JPA. В основном мои курьеры создаются программой, а клиент и посылки создаются пользователем во время работы. Когда я пытаюсь добавить новую посылку, я добавляю объект в список посылки в списке клиентов и парцелл в Courier. Но он падает, когда пытается добавить в список курьерских пакетов. Я создаю объект курьерскую перед вызовом моего меню в главном классеПроблемы с отношением «один ко многим» Java JPA

И выдает следующее сообщение об ошибке: Во время синхронизации новый объект был найден через отношения, которые не был отмечен каскад PERSIST: Courier: Id: 0 Имя : null машина: 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; 
} 

// КЛИЕНТ КЛАСС

@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

Welcom к SO! Не могли бы вы исправить отступы вашего исходного кода и, возможно, разделить его на ядро ​​вашего вопроса? Это много исходного кода для чтения, и люди с большей вероятностью помогут вам, если им легче понять, что не так с вашим решением. –

ответ

0

Вы добавляете свои посылок к Courier, не сохранялись в базе данных еще.

Вы должны упорствовать Courier Объект также.

Так как вы сказали, ваш Courier объекту, что он должен каскадным сохраняться его посылки объектов должно быть на самом деле достаточно просто сохраняться 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; 
Смежные вопросы