2016-04-11 11 views
0

Problemstellung: Country haben Sammlung Beziehung mit State. Ein Land holen, das alle seine Zustände damit verbunden bekommt. Es ist in vielen Fällen erwünscht. Jetzt in einem gegebenen Fall habe ich beide Land id und Zustand id, und wenn Landfilterung mit Zustand Identifikation holen, ist es möglich, einzelnes State in Country zu erhalten?Java-Hibernate-Auflistung Mapping: Nicht Filterung specfic Sammlung Wert

Country.class

@Entity 
@Repository 
@Table(name="COUNTRY") 
class Country implements Serializable{ 

@Id 
@GeneratedValue(startegy=GenerationType.AUTO) 
private long id; 

@OneToMany(mappedBy="country", cascade={javax.persistence.CascadeType.ALL}, fetch=FetchType.EAGER) 
private java.util.Set<State> states; 
//Getters and setters 


} 

State.class

@Entity 
@Repository 
@Table(name="STATE") 
class State implements Serializable{ 

@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name="id", nullable=false, unique=true, updatable=true) 
private long @Id 

@ManyToOne 
@JoinColumn(name="id") 
private Country country; 

//Getter and setter 
} 

Ich habe mit folgenden Abfrage versucht:

//This query works great when used in SQL editor. Getting one state  
select * from country left join state ON country.id = state.id and state.id=3 
//Tried following 
    setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 

über SQL-Abfrage und erstellt Kriterien, aber ich bekomme alle Staaten. Oder dieses Problem kann gelöst werden? Haben wir bessere Alternativen?

Antwort

1

So soll JPA nicht funktionieren. Dies würde zu Problemen beim Verfolgen von Entitätsänderungen führen (der JPA-Anbieter denkt möglicherweise, dass fehlende Status aus der Sammlung entfernt werden).

Hibernate unterstützt dies jedoch mit @Filter und @FilterDef, werfen Sie einen Blick auf this thread. Hier ist der in dem Beispiel verwendete Code:

@Entity 
public class A implements Serializable{ 
    @Id 
    @Column(name = "REF") 
    private int ref; 

    @OneToMany 
    @JoinColumn(name = "A_REF", referencedColumnName = "REF") 
    @Filter(name="test") 
    private Set<B> bs; 
} 

@Entity 
@FilterDef(name="test", defaultCondition="other = 123") 
public class B implements Serializable{ 
    @Id 
    @Column(name = "A_REF") 
    private int aRef; 

    @Id 
    @Column(name = "OTHER") 
    private int other; 
} 

Session session = entityManager.unwrap(Session.class); 
session.enableFilter("test"); 
A a = entityManager.find(A.class, new Integer(0)) 
a.getb().size() //Only contains b that are equals to 123 
Verwandte Themen