Reputation: 2434
I'm trying to do a JPA mapping for an existing database. I can't really change the existing structure.
I managed to make it works, but Intellij is telling me that some column doesn't exist even if it works. So I don't know if there's a better way to do this or if it's Intellij that doesn't support all the use cases.
I simplified my mapping and table for the question. The 2 tables with primary composite keys are:
Table_A
some_id_a
some_seq_a
Table B
some_id_a
some_seq_a
some_seq_b
And my mapping is:
@Data
@Entity(name="Table_A")
public class TableA {
@EmbeddedId
private Key key;
@OneToMany
@JoinColumn(name = "someIdA")
@JoinColumn(name = "someSeqA")
private List<TableB> tableBs;
@Data
@Embeddable
public static final class Key implements Serializable {
private String someIdA;
private long someSeqA;
}
}
@Data
@Entity(name="Table_B")
public class TableB {
@EmbeddedId
private Key key;
@Data
@Embeddable
public static final class Key implements Serializable {
private String someIdA;
private long someSeqA;
private long someSeqB;
}
}
So like I said it works but I have an error in Intellij saying that the @JoinColumn(name ="someIdA") @JoinColumn(name = "someSeqA")
don't exist and is expecting something like @JoinColumn(name ="some_id_a") @JoinColumn(name = "some_seq_a")
.
Using it the way Intellij is telling me, JPA has en error that says: Table [table_b] contains physical column name [some_id_a] referred to by multiple logical column names: [some_id_a], [someIdA].
My mapping is ok despite Intellij but is there's a better alternative ?
Thanks
Upvotes: 0
Views: 117
Reputation: 3276
You can use a "derived identity" and map your classes like this:
@Data
@Entity(name="Table_A")
public class TableA {
@EmbeddedId
private Key key;
@OneToMany(mappedBy = "tableA")
private List<TableB> tableBs;
@Data
@Embeddable
public static final class Key implements Serializable {
private String someIdA;
private long someSeqA;
}
}
@Data
@Entity(name="Table_B")
public class TableB {
@EmbeddedId
private Key key;
@MapsId("tableAKey") // maps tableAKey attribute of embedded id
@JoinColumns({
@JoinColumn(name="some_id_a", referencedColumnName="some_id_a"),
@JoinColumn(name="some_seq_a", referencedColumnName="some_seq_a")
})
@ManyToOne
private TableA tableA;
@Data
@Embeddable
public static final class Key implements Serializable {
private TableA.Key tableAKey; // corresponds to PK type of TableA
private long someSeqB;
}
}
Derived identities are discussed (with examples) in the JPA 2.2 spec in section 2.4.1.
Upvotes: 1