как загрузить некоторые столбцы объекта с отношением многие ко многим в Hibernate - PullRequest
0 голосов
/ 29 декабря 2011

Возникла проблема с загрузкой объекта из базы данных с использованием Hibernate.

У меня есть три класса java: "A", "B" и "C". A и B связаны как отношение «мама-ко-многим» с помощью дополнительной таблицы «a_join_b». A и C связаны как отношение многие-к-одному.

Есть код:

@Entity
@Table(name = "A")
public class AclassEnt implements java.io.Serializable{
 @Id
    @TableGenerator(name = "inventory",
        table = "hibernate_sequences",
        pkColumnName = "sequence_name", 
        pkColumnValue = "Emp_Gen", 
        valueColumnName = "sequence_next_hi_value", 
        initialValue = 0,
        allocationSize = 100)  
    @GeneratedValue(strategy = GenerationType.TABLE) 
    @Column(name = "A_ID", nullable = false)
    private Integer aId;

    @Column(name = "A_NUMBER", length = 20)
    private String aNumber;

    @Column(name = "A_NAME", length = 15)
    private String aName;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE},
                fetch = FetchType.EAGER,
                targetEntity=WorkersEnt.class)
   @JoinColumn(name="C_ID")
    private CclassEnt cclass;

    @ManyToMany(cascade = CascadeType.REFRESH,fetch = FetchType.LAZY,targetEntity = BclassEnt.class)
    @JoinTable(name = "A_join_B", joinColumns = { @JoinColumn(name = "A_ID") }, inverseJoinColumns = { @JoinColumn(name = "B_ID") })
    private Set<BclassEnt> BclassList=new HashSet<BclassEnt>();

    //getters and settrs
}



 @Entity
 @Table(name = "B")
 public class MeasureTypeEnt implements java.io.Serializable{

 @Id
    @TableGenerator(name = "inventory",
    table = "hibernate_sequences",
    pkColumnName = "sequence_name", 
    pkColumnValue = "Emp_Gen", 
    valueColumnName = "sequence_next_hi_value", 
    initialValue = 0,
    allocationSize = 100)  
    @GeneratedValue(strategy = GenerationType.TABLE) 
     @Column(name = "B_ID", nullable = false)
     private Integer bId;

    @Basic(optional = false)
    @Column(name = "B_NAME", nullable = false, length = 100)
    private String bName;

    //getters and setters   
}

Вопрос: как я могу загрузить объект "AclassEnt" с полями Hext: aId, aName, cclass и BclassList ???

Используя следующий код, я могу загрузить все столбцы, что мне нужно, кроме одного последнего. Я имею в виду "BclassList".

Criteria crit = session.createCriteria(AclassEnt.class,"c");
crit.createAlias("cclass", "cclass")
    .createAlias("BclassList", "BclassList")//<-- is it correctly?
    .setProjection( Projections.projectionList()
    .add(Projections.property("c.aId").as("aId"))
    .add(Projections.property("c.aName").as("aName"))
    .add(Projections.property("c.cclass").as("cclass"))
    .add(Projections.property("c.BclassList").as("BclassList"))//<-- is it correctly?
    );

AclassEnt result = crit.setResultTransformer(new AliasToBeanResultTransformer( AclassEnt.class )).list();

1 Ответ

0 голосов
/ 29 декабря 2011

у вас должен быть доступ к вашему списку сущностей B только с помощью получателя класса A.В вашем случае установите myAobject.getbClassList ();

Так что вам просто нужно создать запрос / критерии для получения вашей сущности.После этого просто позвоните получателю вашего набора и работайте с ним.Не нужно делать сложные запросы.Например: currentSession (). Get (AclassEnt.class, 1);или currentSession (). createCriteria (AclassEnt.class) .list ();...

Но будьте осторожны, если у вас есть отложенная загрузка и вы пытаетесь получить к ней доступ вне транзакции, вы получите ленивые исключения.Решение состоит в том, чтобы сделать ленивую выборку нетерпеливой.И вам не нужно создавать экземпляр Set.

Я не был уверен, поэтому проверил документ, но ваше определение однонаправленного отношения ManyToMany кажется правильным: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/ 2.2.5.3.2.Многие ко многим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...