2014-12-18 13 views
5

Ho un'entità giro che incorpora una "entità" embeddable percorso. Il percorso ha una proprietà Elenco città con una relazione ManyToMany, quindi ha tipo fetchtype LAZY (e non voglio usare EAGER). Quindi voglio definire un NamedEntityGraph per l'entità giro, per caricare caricare un oggettogiro con un percorso con instantied Elenco dei città. Ma quando schiero la mia guerra, ottengo questa eccezione:JPA sottografo per definire fetchType di una proprietà incorporato

java.lang.IllegalArgumentException: Attribute [percorso] non è di tipo gestito

giro

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

Route

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

    @ManyToMany 
    private List<Town> towns; 

    // some getter and setter 
} 

risposta

5

Guardando implementazione di Hibernate di org.hibernate.jpa.graph.internal.AttributeNodeImpl ci portano alla conclusione che @NamedAttributeNode non può essere:

  • semplici tipi (primitivi Java ed i loro involucri, stringhe, enums, temporali, ...)
  • embeddables (annotato con @Embedded)
  • collezioni di elementi (annotate con @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()) 
    ); 
} 

Non ho trovato restrizioni simili nelle specifiche JPA 2.1, quindi potrebbe essere la mancanza di Hibernate.


Nel caso specifico il problema è che @NamedEntityGraph riferisce alla classe Route che è incorporabile, quindi il suo utilizzo nel grafico entità sembra essere proibita dalla Sospensione (purtroppo).

Per farlo funzionare, è necessario modificare leggermente il modello di entità. Alcuni esempi che mi vengono in mente:

  • definiscono Route come entità
  • rimuovere Route e spostare la sua towns campo in Ride entità (semplifica il modello di entità)
  • mossa route campo dalla Ride in Town entità , aggiungi mappa di routedTowns mappa per Ride entità:

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

Ovviamente il grafico delle entità potrebbe richiedere modifiche di conseguenza.

Problemi correlati