Коллекция сохранений в спящем режиме

Я использую Hibernate 4 (с Spring), чтобы сохранить свой объект в базе данных. У меня есть проблема, когда я пытаюсь сохранить родителя с дочерней коллекцией.

Моя таблица:

| A | => PK (Composite) [String + Integer]
| B | => PK (Composite) [Stirng + Integer] + Integer

Естественно, ПК B является составным с теми же ПК A, и A содержит набор B.

В моем коде я хочу:

A parent = new A();
parent.addCollection(new B());
parentDao.create(parent)

Когда Hibernate сохраняет объект, он может установить String в A PK и вычислить max + 1 для Inter. Точно так же для B PK Hibernate устанавливает то же значение PK из A (родительский => дочерний) и вычисляет max + 1 для второго Intenger.

Это возможно? заранее спасибо

ИЗМЕНИТЬ

Мои занятия:

Class A {
    static Class A_PK {
      private String codAzienda;
      private Integer year;
      ... Get, Set, HashCode, Equals and toString() ...
    }

   private A_PK id;

   ... another columns ...

   @OneToMany(cascade=ALL)
   @JoinColumns({
      @JoinColumn(name="cod_azienda"),
      @JoinColumn(name="year")
   })
   List<B> children;
}

Class B {
   static Class B_PK {
       private String codAzienda;
       private Integer year;
       private Integer nextId;
       ... Get, Set, HashCode, Equals and toString() ...
   }

 @EmbeddedId
@AttributeOverrides({
   @AttributeOverride(name = "codAzienda", column = @Column(name = "cod_azienda")),
   @AttributeOverride(name = "codCliente", column = @Column(name = "cod_cliente"))
})

   private B_PK id;
   ... another columns ...
}

person stefanopulze    schedule 20.03.2013    source источник
comment
Да, это возможно, но что вы пробовали до сих пор?   -  person overmeulen    schedule 20.03.2013
comment
Я пытался использовать собственный прослушиватель событий saveOrUpdate, использовать Interceptor и AOP из моего DAO.   -  person stefanopulze    schedule 20.03.2013


Ответы (1)


Попробуйте следующее:

A.java

@Entity
@Table(name = "TABLE_A")
public class A implements Serializable {

    @Id
    @Column(name = "STR_ID")
    private String strId;

    @Id
    @Column(name = "INT_ID")
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Integer intId;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "a")
    private List<B> bs;

    public A(String strId) {
        this.strId = strId;
    }

    public void addB(B b) {
        if (bs == null) {
            bs = new ArrayList<B>();
        }
        b.setA(this);
        bs.add(b);
    }
}

B.java

@Entity
@Table(name = "TABLE_B")
public class B implements Serializable {

    @Id
    @Column(name = "INT_ID")
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Integer intId;

    @Id
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name = "A_STR_FK", referencedColumnName = "STR_ID"),
        @JoinColumn(name = "A_INT_FK", referencedColumnName = "INT_ID")
    })
    private A a;

    void setA(A a) {
        this.a = a;
    }
}
person overmeulen    schedule 21.03.2013
comment
Спасибо за ответ. В моем случае B становится: public class B { private String strId; // A foreign key private Integer intId; // A foreign key private Integer intIdB; } - person stefanopulze; 21.03.2013
comment
Составной внешний ключ для A автоматически создается Hibernate, и, поскольку я аннотировал сопоставление ManyToOne с помощью @Id, поля этого внешнего ключа также будут использоваться в составном первичном ключе B. - person overmeulen; 21.03.2013
comment
Здорово! Ваш код работает нормально. Но если я хочу сохранить только B, мне нужно создать B и создать A для установки первичного ключа! Я не знаю, почему Hibernate не может установить ссылку (@OneToMany parent на дочерний), если поле является составным идентификатором (@EmebedId аннотации) - person stefanopulze; 21.03.2013
comment
Если первичный ключ B включает в себя внешний ключ A, то экземпляр B никогда не должен существовать без экземпляра A! Если это действительно то, что вы хотите, то ваша модель данных нелогична, и вам, возможно, следует использовать разные столбцы для первичного ключа B и внешнего ключа A (даже если они содержат одно и то же значение) - person overmeulen; 21.03.2013