I have a simple relationship as shown in the diagram above.
I can persist this using the following Hibernate Mapping:
<class name="Strategy" table="Strategy">
<id name="id" column="StrategyId" unsaved-value="any">
<generator class="identity"/>
</id>
<property name="status" column="Status"/>
</class>
<class name="Alert" table="Alert">
<id name="id" column="AlertId">
<generator class="identity"/>
</id>
<property name="name" column="Name"/>
</class>
<class name="StrategyAlert" table="StrategyAlert">
<composite-id>
<key-many-to-one name="strategy" class="Strategy" column="StrategyId"/>
<key-many-to-one name="alert" class="Alert" column="AlertId"/>
</composite-id>
<property name="nominal" column="Nominal"/>
</class>
I am having a really hard time trying to figure out how to do this using Annotations in JPA 1.0.
Here's what I've got so far:
Alert Class:
@Entity
@Table(name="ALERT")
public class Alert implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ALERTID")
private int id;
@Column(name="NAME")
private String name;
}
Strategy Class:
@Entity
@Table(name="STRATEGY")
public class Strategy implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="STRATEGYID")
private int id;
@Column(name="STATUS")
private String status;
}
StrategyAlertPK class:
public class StrategyAlertPK implements Serializable {
private int strategyId;
private int alertId;
}
StrategyAlert class:
@Entity
@Table(name="STRATEGYALERT")
@IdClass(StrategyAlertPK.class)
public class StrategyAlert implements Serializable {
@Id
@Column(name="STRATEGYID")
private int strategyId;
@Id
@Column(name="ALERTID")
private int alertId;
@ManyToOne
@JoinColumn(name="STRATEGYID", insertable=false, updatable=false)
private Strategy strategy;
@ManyToOne
@JoinColumn(name="ALERTID", insertable=false, updatable=false)
private Alert alert;
@Column
private String nominal;
}
Test Case:
em.getTransaction().begin();
Alert alert = new Alert();
alert.setName("NAME");
em.persist(alert);
Strategy strategy = new Strategy();
strategy.setStatus("STATUS");
em.persist(strategy);
StrategyAlert strategyAlert = new StrategyAlert();
strategyAlert.setAlert(alert);
strategyAlert.setStrategy(strategy);
strategyAlert.setNominal("NOMINAL");
em.persist(strategyAlert);
em.getTransaction().commit();
I'm getting the following error:
Referential integrity constraint violation: "FK80432DA9CE00672E: PUBLIC.STRATEGYALERT FOREIGN KEY(STRATEGYID) REFERENCES PUBLIC.STRATEGY(STRATEGYID) (0)
I'm using <property name="hibernate.hbm2ddl.auto" value="create" />
to generate the tables.
How do I annotate the StrategyAlert class correctly?