Внешний ключ также является частью первичного ключа.

Возможно ли в простых расширениях JPA или JPA+Hibernate использовать внешний ключ, который также является частью составного первичного ключа?

@TableGenerator(name = "trial", table = "third",
        pkColumnName = "a" , valueColumnName = "b", pkColumnValue = "first")    
@Entity    
public class First{    
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "trial")
protected int a;

@OneToMany(mappedBy ="first", cascade = CascadeType.PERSIST)
@JoinColumn(name = "a")
protected List<Second> seconds;
}

class IDC implements Serializable{
 //@Column(name = "a", insertable = false, updatable = false)
    protected int a;
protected int b;
}

@Entity    
@IdClass(IDC.class)
public class Second{    
    @Id
  //@Column(name = "a", insertable = false, updatable = false)
protected int a;
@Id
protected int b;

    @ManyToOne
@JoinColumn(name = "a"/*, insertable = false, updatable = false*/)
First first;
}

главный:

public class Persister {
public static void main(String[] args) {

First aFirst = new First();

Second aSecond = new Second();
aSecond.b = 300;    
List<Second> scnds = new ArrayList<Second>();
scnds.add(aSecond);

aFirst.seconds = scnds;
aSecond.first = aFirst;


aEntityManager.getTransaction().begin();
aEntityManager.persist(aFirst);
aEntityManager.getTransaction().commit();
}}

Проблема в классе "Второй":

Если я установлю «insertable = false, updateable = false» в поле «a», это вызовет исключение:

"Индекс параметра выходит за допустимые пределы. 4 не находится между допустимыми значениями 1 и 3"

И если я установлю «insertable = false, updateable = false» в отношении @manyToOne, он запустится, но установит 0 в «a» в таблице «Second»

Цель: установить сгенерированное значение First.a в Second.a.

/////////////////////////////

sql для создания БД:

сначала создать таблицу (целое число, первичный ключ (a));

создать вторую таблицу (a int, b int, первичный ключ (a, b));

создать третью таблицу (a varchar (20), b int);

пожалуйста помоги

Спасибо заранее


person Moro    schedule 28.04.2009    source источник


Ответы (1)


Во-первых, вы уверены, что вам это нужно? ...

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

Чтение сгенерированного ключа можно сделать так:

...
First first = new First();
entityManager.save(first);  //<- the id is updated

Second second = new Second();
second.setB(300);     
second.setA(first.getA()); 

first.setSeconds( new ArrayList());
first.getSeconds().add(second);
entityManager.save(second);

entityManager.getTransaction().commit();

Вы читали это?

Java Persistence: сопоставление соединяемой таблицы с дополнительными столбцами

Это не JPA, но если вам повезет, спящий режим может поддерживать установку тегов @Id и @ManyToOne в одном и том же поле. Вы пробовали это? Было бы неплохо, не правда ли :-) ...

 @Id  // may not work
 @ManyToOne // may not work
 @JoinColumn(name = "a")
 First a;

О, и что это за префикс "а"? Аргумент? Двусмысленный ? Двойственное? Предприятие?

person KarlP    schedule 28.04.2009
comment
Спасибо за вас, я попробовал @id на @manytoone, но, похоже, он не работает. - person Moro; 28.04.2009