Foriegn Key Not Updating [message #1645365] |
Mon, 02 March 2015 13:22  |
Eclipse User |
|
|
|
I have a problem in update data which involves foreign keys. What I want is to be able to update the foreign key value depending on the choice of the selected matching entity. (Am using glasshfish 4, JPA 2.1 and EclipseLink)
The scenario I have is, I have an Entity called Institution which has a ManyToOne association with InstutionType as shown below.
@Entity
@Table(name="Institution")
public class Institution {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "Id")
private Integer id;
@Column(name = "Name", length = 150, nullable = false)
private String name;
@ManyToOne
@JoinColumn(name = "InstitutionTypeId",referencedColumnName="Id",updatable=true)
private InstitutionType institutionType;
.
.
.
}
@Entity
@Table(name="InstitutionType")
public class InstitutionType {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="Id")
private int id;
@Column(name="Code",nullable=false, length=10, unique=true, updatable=false)
private String code;
@Column(name="Description",nullable=false, unique=true,length=50)
private String description;
.
.
.
}
Whenever I update the institution, code and name fields are updated, but InstutionTypeId is not updated to match the current InstitutionType. To observer what is happening, I added a logging statement in the dao and observed that the new InstutionType is passed but not persisted.
What am I missing in the code.
|
|
|
Re: Foriegn Key Not Updating [message #1649829 is a reply to message #1645365] |
Wed, 04 March 2015 14:30   |
Eclipse User |
|
|
|
Can you show with a code example what you are doing and how you are merging your changes? Is the institutionType reference pointing to an entirely different InstitutionType instance, or is it that changes to the referenced instance are not being picked up?
If it is the later, you should know what merge will only cascade through the object graph over references marked with the 'cascade=CascadeType.MERGE' . Adding this to your mapping might help give you the behavior you are looking for.
|
|
|
Re: Foriegn Key Not Updating [message #1651208 is a reply to message #1649829] |
Thu, 05 March 2015 07:05   |
Eclipse User |
|
|
|
Thanks for your response, however when I use cascade=CascadeType.MERGE I get the following exception
javax.persistence.PersistenceException: Exception [EclipseLink-7251] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The attribute [id] of class [packagename.InstitutionType] is mapped to a primary key column in the database. Updates are not allowed.
Certainly, I have opted to add the log which was created when using FINEST as the logging level. What you will observe, is that the class to be persist has an InstitutionType with Id=7, however before persisting it seems it retrieves an old one with Id=5. What I want is InstitutionType with Id=5 be updated with the one with Id=7. See the log below
Partial log
2015-03-05T08:54:42.126+0200|Finest: Merge clone with references Institution [id=13, name=CCM Theological College, institutionType=InstitutionType [id=7, description=College, active=true]]
2015-03-05T08:54:42.127+0200|Finest: Register the existing object InstitutionType [id=5, description=College, active=true]
Full Log
2015-03-05T08:54:42.125+0200|Finer: client acquired: 2099166034
2015-03-05T08:54:42.126+0200|Finer: TX binding to tx mgr, status=STATUS_ACTIVE
2015-03-05T08:54:42.126+0200|Finer: acquire unit of work: 462441259
2015-03-05T08:54:42.126+0200|Finest: Merge clone with references Institution [id=13, name=CCM Theological College, institutionType=InstitutionType [id=7, description=College, active=true]]
2015-03-05T08:54:42.127+0200|Finest: Register the existing object InstitutionType [id=5, description=College, active=true]
2015-03-05T08:54:42.127+0200|Finer: TX beforeCompletion callback, status=STATUS_ACTIVE
2015-03-05T08:54:42.127+0200|Finer: begin unit of work commit
2015-03-05T08:54:42.127+0200|Finer: TX afterCompletion callback, status=COMMITTED
2015-03-05T08:54:42.127+0200|Finer: end unit of work commit
2015-03-05T08:54:42.128+0200|Finer: release unit of work
2015-03-05T08:54:42.128+0200|Finer: client released
Note that when persisting I use:
entityManager.merge(institution)
You assistance will be appreciated
[Updated on: Thu, 05 March 2015 07:42] by Moderator Report message to a moderator
|
|
|
Re: Foriegn Key Not Updating [message #1651788 is a reply to message #1651208] |
Thu, 05 March 2015 14:06   |
Eclipse User |
|
|
|
The error states that EclipseLInk thinks you are attempting to change the primary key on an entity, which isn't supported. You need to check the code you are using to read in the Institution and change the institutionType reference, making sure that you are changing the reference and not just changing the associated InstitutionType instance to have a different primary key.
[Updated on: Thu, 05 March 2015 14:06] by Moderator Report message to a moderator
|
|
|
Re: Foriegn Key Not Updating [message #1651816 is a reply to message #1651788] |
Thu, 05 March 2015 14:29  |
Eclipse User |
|
|
|
Thanks Chris for your precise solution. It has now worked.
Certainly, I had all be belief that the change of the Id field for an InstitutionType would effect the change. Following you suggestion, I retrieved the Institution object, stored the InstitutionTypeId to a temporary variable, then created a new InstitutionType and set its Id using the old Id. Thereafter the institution object is bound to the user interface for modifications.
See the code below
public Institution getInstitution() {
if(institution==null){
institution=new Institution();
institution.setInstitutionType(new InstitutionType());
institution.setAddress(new Address());
}
if(institution.getInstitutionType().getId()!=0){
int oldId=institution.getInstitutionType().getId();
institution.setInstitutionType(new InstitutionType());
institution.getInstitutionType().setId(oldId);
}
return institution;
}
Thanks once more! If there is a better way of archiving this, be free to advise. THANNNNNNNNNNNNNNKS!
|
|
|
Powered by
FUDForum. Page generated in 0.03537 seconds