2014-12-18 10 views
5

Posiadam jednostkę Ride, która osadza osadzaną "encję" Route. Route ma właściwość List miast z relacją ManyToMany, więc ma fetchtype LAZY (i nie chcę używać EAGER). Więc chcę zdefiniować NamedEntityGraph dla podmiotu jazda, aby załadować załadować Przejażdżkę obiekt o Route z instantied Lista miast. Ale gdy wdrożyć moja wojna, otrzymuję ten wyjątek:JPA SubGraph do definiowania typu fetchty właściwości osadzonej.

java.lang.IllegalArgumentException: Attribute [trasy] nie jest zarządzanych typu

Przejażdżkę

@Entity 
@NamedQueries({ 
@NamedQuery(name = "Ride.findAll", query = "SELECT m FROM Ride m")}) 
@NamedEntityGraphs({ 
@NamedEntityGraph(
     name = "rideWithInstanciatedRoute", 
     attributeNodes = { 
      @NamedAttributeNode(value = "route", subgraph = "routeWithTowns") 
     }, 
     subgraphs = { 
      @NamedSubgraph(
        name = "routeWithTowns", 
        attributeNodes = { 
         @NamedAttributeNode("towns") 
        } 
      ) 
     } 
    ) 
}) 
public class Ride implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Embedded 
    private Route route; 

    // some getter and setter 
} 

Trasa

@Embeddable 
public class Route implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @ManyToMany 
    private List<Town> towns; 

    // some getter and setter 
} 

Odpowiedz

5

Patrząc na realizację Hibernate z org.hibernate.jpa.graph.internal.AttributeNodeImpl prowadzą nas do wniosku, że @NamedAttributeNode nie może być:

  • typów prostych (prymitywów Java i ich owijarki, smyczki, wyliczenia, temporals, ...)
  • embeddables (odnotowany z @Embedded)
  • zbiorów element (opatrzone @ElementCollection)
if (attribute.getPersistentAttributeType() == Attribute.PersistentAttributeType.BASIC || 
    attribute.getPersistentAttributeType() == Attribute.PersistentAttributeType.EMBEDDED) { 
    throw new IllegalArgumentException(
     String.format("Attribute [%s] is not of managed type", getAttributeName()) 
    ); 
} 

Nie znalazłem podobnego ograniczenia w specyfikacji JPA 2.1, dlatego może to być wada Hibernate.


w danym przypadku problemem jest, że @NamedEntityGraph dotyczy klasy Route który jest zabudowany, a tym samym jego wykorzystanie na wykresie jednostki wydaje się być zakazane hibernacji (jeszcze).

Aby to działało, trzeba było trochę zmienić swój model jednostki. Kilka przykładów, które przychodzą mi do głowy:

  • określić Route jako podmiot
  • usunąć Route i przenieść swój towns pole do Ride podmiotu (upraszcza model jednostki)
  • ruch route pole z Ride do Town podmiotu , dodaj mapę jednostki routedTowns do Ride podmiot:

    @Entity 
    public class Ride implements Serializable { 
        ... 
        @ManyToMany(mappedBy = "rides") 
        private Map<Route, Town> routedTowns; 
        ... 
    } 
    
    @Entity 
    public class Town implements Serializable { 
        ... 
        @ManyToMany 
        private List<Ride> rides; 
        @Embeddable 
        private Route route; 
        ... 
    } 
    

Oczywiście wykres jednostki może wymagać odpowiednich zmian.

Powiązane problemy