Hibernate adding/overwriting records incorrectly
I am a HIbernbate newbie and have a problem that has been bothering me for days. Here is a rundown of the issue I am having:
1. There is a @Entity class called Resource which contains a Key field and an ID field.
2. There is a @Entity class called Agreement which extends Resource.
3. There is a @Entity class called Schedule which extends Resource and contains an Agreement field.
4. There is a @Entity class called AgreementProperty.
5. There is a @Entity class called PositionAgreementProperty which extends AgreementProperty.
6. There is a @Entity class called ShiftAgreementProperty which extends AgreementProperty.
7. Agreement has a field which is a List of PositionAgreementProperty classes.
8. Agreement has a field which is a List of ShiftAgreementProperty classes.
9. When I add an Agreement via the web page, Hibernate populates:
a. the Agreement table with one record that contains nothing but an agreement_key of 1
b. the Resource table with one record, including the agreement_key and a generated ID
c. the AgreementProperty table with 5 records containing keys 1 - 5.
d. the PositionAgreementProperty table that contains the agreement_key (always set to 1) and the 1, 2, 3 AgreementProperty keys
e. the ShiftAgreementProperty table that contains the agreement_key (always set to 1) and the 4, 5 AgreementProperty keys
10. When I then add a Schedule via the web page, which includes the name of the Agreement from the database, Hibernate populates:
a. the Agreement table with new record with an agreement_key of 2.
b. the Resource table with a new record with an agreement_key of 2 and a generated ID of NULL
c. the Resource table with a second new record for the Schedule.
11. The PositionAgreementProperty and ShiftAgreementProperty tables have their agreement_key fields updated from 1 to 2, for the "new" Agreement.
12. Now Agreement 1 does not have any PositionAgreementProperty nor ShiftAgreementProperty records associated with it.
What I am trying to figure out is:
1. Can I prevent a new Agreement from being added and just use the previous agreement_key
a. I think Hibernate does this because both Agreement and Schedule get their key values by inheriting from Resource
2. If not, can I make Hibernate insert new AgreementProperty records instead of updating the existing ones?
The following are the class definitions (with the getters and setters removed for the sake of brevity):
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@XmlRootElement
public class Resource implements Serializable {
@Id
@Column(name = "_key")
@GeneratedValue
@XmlTransient
private Long key;
@Column(unique = true)
@XmlTransient
private String id;
}
@Entity
@XmlRootElement
public class Agreement extends Resource {
@JoinColumn(name = "agreement__key", referencedColumnName = "_key")
@OneToMany(cascade = CascadeType.ALL)
private List<PositionAgreementProperty> positionProperties = new ArrayList<PositionAgreementProperty>();
@JoinColumn(name = "agreement__key", referencedColumnName = "_key")
@OneToMany(cascade = CascadeType.ALL)
private List<ShiftAgreementProperty> shiftProperties = new ArrayList<ShiftAgreementProperty>();
}
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@XmlRootElement
public class AgreementProperty implements Serializable {
@Id
@Column(name = "_key")
@GeneratedValue
@XmlTransient
private Long key;
}
@Entity
@XmlRootElement
public class PositionAgreementProperty extends AgreementProperty {
public PositionAgreementProperty() {
super();
}
}
@Entity
@XmlRootElement
public class ShiftAgreementProperty extends AgreementProperty {
public ShiftAgreementProperty() {
super();
}
}
@Entity
@XmlRootElement
public class Rotation extends Resource {
}
@Entity
@XmlRootElement
public class Schedule extends Rotation {
@OneToOne(cascade = CascadeType.ALL)
private Agreement agreement;
}
Any help offered would be appreciated. I am not sure what kind of code examples I should include besides the class declarations since the code doing the "work" was generated via Google Guice. Thanks.