2014-12-18 10 views
5

Ich habe eine Entität Fahrt, die eine einbettbare "Entität" enthält Route. Route hat eine List-Eigenschaft Städte mit ManyToMany Beziehung, so hat es Fetchtype LAZY (und ich möchte nicht Eager verwenden). Deshalb möchte ich eine NamedEntityGraph für die Entität Fahrt, definieren, zu laden, laden Sie eine Fahrt Objekt mit einer Strecke mit instantied Liste der Städte. Aber wenn ich meinen Krieg einsetzen, bekomme ich diese Ausnahme:JPA SubGraph zum Definieren des Abnahmetyps einer eingebetteten Eigenschaft

java.lang.IllegalArgumentException: Attribut [route] ist nicht Typ

Fahrt

@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 
} 

verwaltet von Route

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

    @ManyToMany 
    private List<Town> towns; 

    // some getter and setter 
} 

Antwort

5

Mit Blick auf Hibernate Implementierung von org.hibernate.jpa.graph.internal.AttributeNodeImpl führen uns zu dem Schluss, dass @NamedAttributeNode nicht sein kann:

  • einfache Typen (Java Primitive und die Verpackungen, Streicher, Aufzählungen, Schläfen, ...)
  • Embeddables (kommentierten mit @Embedded)
  • Element Sammlungen (kommentierten mit @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()) 
    ); 
} 

Ich habe keine ähnliche Einschränkung in JPA 2.1 spec gefunden, daher kann es Hibernate's Manko sein.


In Ihrem speziellen Fall ist das Problem, dass @NamedEntityGraph auf die Route Klasse bezieht, das ist eine integrierbare, also in der Einheit Graph seine Verwendung scheint von Hibernate (leider) verboten werden.

Um es funktionieren zu lassen, müssten Sie Ihr Entitätsmodell ein wenig ändern. Einige Beispiele, die mir in den Sinn kommen:

  • Route als Einheit
  • entfernen Route definieren und seine towns Feld in Ride Einheit bewegen (vereinfacht das Entity-Modell)
  • bewegen route Feld von Ride in Town Einheit , addieren Karte von routedTowns Karte zu Ride Einheit:

    @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; 
        ... 
    } 
    

Natürlich kann das Entity-Diagramm Änderungen erfordern.

Verwandte Themen