Проблема в JPA Каскадное Сохранение с EmbeddedId в дочернем элементе

У меня три класса. Person,vehicle и association класс, чтобы связать человека и транспортное средство

Человек

package entity;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

@Entity
@Table(name ="PERSON")
public class Person {
@EmbeddedId
private PKperson pkPerson;

@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade=CascadeType.ALL,mappedBy="person")
private Set<PersonVehAssnVO> personVehAssnVOSet=new HashSet<PersonVehAssnVO>();

//getters & setters
}

PKperson

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class PKperson implements Serializable {

@Column(name="NAME", nullable=false)
private String name;

@Column(name="DOB_DT", nullable=false)
private Date dobDt;
}

Транспортное средство

package entity;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.OneToMany;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

@Entity
@Table(name ="VEHICLE")
public class Vehicle {
@Id
@Column(name="VEHICLE_ID",unique=true, nullable=false)  
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_name")
@SequenceGenerator(allocationSize = 1, name = "seq_name", sequenceName = "SEQ_VEHICLE_ID")
private Long vehicleId;

@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade=CascadeType.ALL,mappedBy="vehicle")
private Set<PersonVehAssnVO> personVehAssnVOSet=new HashSet<PersonVehAssnVO>();

private String vehicleName;

//getters & setters
}

Ассоциация Персонажа

package entity;

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

@Entity
@Table(name ="PERSON_VEHICLE_ASSOC")
public class PersonVehAssnVO {
@EmbeddedId
private PKperson pkPerson;

@ManyToOne
@JoinColumns({ @JoinColumn(name = "pkPerson.name",referencedColumnName ="NAME"),
@JoinColumn(name = "pkPerson.dobDt",referencedColumnName ="DOB_DT")})
private Person person;

@ManyToOne
@JoinColumn(name = "VEHICLE_ID", referencedColumnName = "VEHICLE_ID")
private Vehicle vehicle;

//getters & setters
}


//**Save Method**
PKperson pkPerson = new PKperson();
SimpleDateFormat dtFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = dtFormat.parse("1984-12-14");
pkPerson.setName("Magesh");
pkPerson.setDobDt(date1);

Person person = new Person();
person.setPKperson(pkPerson);

Vehicle vehicle = new Vehicle();
vehicle.setName("Honda350");

PersonVehAssnVO perVehAssnVO = new PersonVehAssnVO();
PersonVehAssnVO.setPKperson(pkPerson);
PersonVehAssnVO.setVehicle(vehicle);

Set<PersonVehAssnVO>  assocSet = new HashSet<PersonVehAssnVO>();
assocSet.add(PersonVehAssnVO);

person.setpersonVehAssnVOSet(assocSet);
vehicle.setpersonVehAssnVOSet(assocSet);

Session session = getHibernateTemplate().getSessionFactory().openSession();
transaction = session.beginTransaction();

transaction.begin();    
session.save(person);       
transaction.commit();

//=============================================================

При выполнении вышеупомянутой логики сохранения я получаю ошибку ": [entity.PersonVehAssnVO#component[name,dobDt]{dobDt=magesh, dobDt=1984-12-14 00:00:00}]"

Show Sql Gives "select personVehAssnVO_.NAME, personVehAssnVO_.DOB_DT, personVehAssnVO_.VEHICLE_ID as vehicle_34 from PERSON_VEHICLE_ASSOC where personVehAssnVO_.NAME=? and personVehAssnVO_.DOB_DT=?"

Я хочу сохранить Person,Vehicle а также association в одно средство сохранения CASCADE ALL Когда я сохраняю Person,

Любая помощь приветствуется

1 ответ

Отметьте дату в PKPerson с помощью @Temporal аннотация:

@Temporal(TemporalType.TIME)
@Column(name="DOB_DT", nullable=false, length = 8)
private Date dobDt;

Согласно документу Java

Эта аннотация должна быть указана для постоянных полей или свойств типа java.util.Date и java.util.Calendar. Это может быть указано только для полей или свойств этих типов.

Временная аннотация может использоваться вместе с базовой аннотацией, аннотацией Id или аннотацией ElementCollection (когда значение коллекции элементов имеет такой временной тип).

И согласно этому такому вопросу:

В простых API Java временная точность времени не определена. При работе с временными данными вы можете описать ожидаемую точность в базе данных. Временные данные могут иметь точность DATE, TIME или TIMESTAMP (т.е. фактическая дата, только время или оба). Используйте аннотацию @Temporal для точной настройки.

Я надеюсь, что это решит вашу проблему. Вы можете поменять местами TemporalType с другими, которые соответствуют вашему типу поля в базе данных. Длина столбца также может быть изменена соответствующим образом.

редактировать

Я думаю, что вы также должны удалить mappedBy="person" а также mappedBy="vehicle" из аннотации PersonVehAssnVO задает в классах Person и Vehicle и заменяет их полными свойствами столбцов, чтобы эти классы могли быть владельцами отношений. В противном случае, когда вы сохраните человека, он будет игнорировать обновление любых свойств, отмеченных mappedby аннотации, потому что это означает, что человек не является владельцем этих отношений.

Другие вопросы по тегам