私は子クラスに2つの子クラスを持つ抽象親クラスを持っています。JPA継承:マッピングされたスーパークラスとテーブルごとのクラス
// Class that has the mapping to the abstract class
@Entity
@Table(name="telephone_numbers")
public class TelephoneNumber implements Serializable {
@Id
@Column(name="number")
private String number;
@Column(name="originating_carrier")
private String originatingCarrier;
@OneToOne(mappedBy = "number")
private TelephoneNumberAssignment assignment;
... getters and setters ...
}
// Classes involved in inheritance
public abstract class TelephoneNumberAssignment implements Serializable {
@Id
@OneToOne
@JoinColumn(name="number")
private TelephoneNumber number;
... getters and setters ...
}
@Entity
@Table(name="telephone_numbers_fixed_line")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class FixedLineNumberAssignment extends TelephoneNumberAssignment {
@Column(name="recorded")
private Boolean recorded;
public FixedLineNumberAssignment() {
}
... getters and setters ...
}
@Entity
@Table(name="telephone_numbers_mobile")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class MobileNumberAssignment extends TelephoneNumberAssignment {
@ManyToOne
@JoinColumn(name = "customer_id")
private Customer customer;
public MobileNumberAssignment() {
}
... getters and setters ...
}
this questionへの回答によると、スーパークラスで私のJPAのアノテーションは、私が@MappedSuperclass
を使用する必要がある子クラスに引き継がするために:私はまた、親クラスとの関係を持っている別のクラスを持っています。しかし、スーパークラスへのマッピングの要件に、次の例外が発生します。
Caused by: org.hibernate.AnnotationException: Unknown mappedBy in: com.vtsl.domain.numbering.TelephoneNumber.assignment, referenced property unknown: com.vtsl.domain.numbering.TelephoneNumberAssignment.number
私はこの問題を解決するためにTABLE_PER_CLASS
を使用することができthis questionへの回答によります。しかし、それを行うと、スーパークラスのJPAアノテーションは継承されないように見えます。私はJPQLクエリ
return entityManager.createQuery("SELECT mob FROM MobileNumberAssignment as mob INNER JOIN FETCH mob.number", MobileNumberAssignment.class).getResultList();
を実行する場合、返された結果は、人口の多い彼らのnumber
フィールドを持っていない(さらに検査時に私は、結果オブジェクトのプロパティを解決しようとすると、Hibernateはnumber
プロパティを検出しないことがわかりました)。しかし、私が次のことを実行した場合:
//Result set has 1 object
entityManager
.createQuery("SELECT mob FROM MobileNumberAssignment as mob INNER JOIN FETCH mob.number WHERE mob.number.number = :number", MobileNumberAssignment.class)
.setParameter("number", "number that exists")
.getResultList()
//Result set has 0 object
entityManager
.createQuery("SELECT mob FROM MobileNumberAssignment as mob INNER JOIN FETCH mob.number WHERE mob.number.number = :number", MobileNumberAssignment.class)
.setParameter("number", "number that does not exist")
.getResultList()
この結果は、結局、パラメータが正常に解決されたことを示しているようです。
なぜnumber
プロパティにデータが入力されないのですか?