2016-11-29 4 views
2

私は子クラスに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プロパティにデータが入力されないのですか?

答えて

0

私はこの症状から間違った結論を導いてきました。この問題は、継承仕様ではなく、マップされた主キーの仕様と全く同じでした。私は

@Id 
@OneToOne 
@JoinColumn(name="number") 
private TelephoneNumber number; 

がうまく動作するはずです見つかったすべてのリソースによると、しかし、私が(4.10)を使用しています休止状態のバージョンではそれがないと思われます。 @MapsIdを使用するようにマッピングを変更すると、私が観察していた問題が解決され、新しい(現在作業中の)TelephoneNumberAssignmentは次のようになります。

関連する問題