2014-11-04 5 views
0

У меня есть две таблицы:отображение JPA/Hibernate с @SecondaryTable аннотацию

part { 
    int id; --> primary key, auto generated 
    varchar poNo; 
    varchar partNo; 
    varchar partDesc; 
    varchar eccNo; 
    ... 
} 

supplement { 
    int id; --> primary key 
    varchar poNo; --> foreign key 
    varchar partNo; --> foreign key 
    varchar venderPartNo; 
    varchar exportHSCCode; 
    ... 
} 

я определил одну сущность, как показано ниже:

@Entity 
@Table(name="part") 
@SecondaryTable(name="supplement", pkJoinColumns ={@PrimaryKeyJoinColumn="id"}) 
public class Part{ 
    @Id 
    @GeneratedValue 
    private Integer id; 

    private String poNo; 

    private String partNo; 

    private String partDesc; 

    private String eccNo; 
    @Column(table="supplement") 
    private String vernderPartNo; 
    @Column(table="supplement") 
    private String exportHSCCode; 
    ... 
    getter and setter... 
} 

Вопрос 1:

, когда я упорно одна часть, Я не хочу вставлять одну строку в таблицу дополнений, есть ли какая-либо конфигурация или аннотация, чтобы ее получить? Поскольку в соответствии с выше Сущности и конфигурации, когда я настойчив одну часть, спящий режим будет генерировать два заявления SQL вставки для меня:

insert into part(poNo, partNo, partDesc, eccNo) values (?,?,?,?) 
insert into supplement(vernderPartNo, exportHSCCode, id) vaules (?,?,?) 

, который я хочу есть, когда сохраняется одна часть, я не ставил значение для любого поданной дополнения, то только одна вставка: Вставить в часть (poNo, partNo, partDesc, eccNo) значения (?,?,?,?)

Возможно ли это?

Вопрос 2:

из таблицы схемы выше, Pono и PARTNO является внешним ключом, это означает, что для каждой соответствующей части и дополнения, это два поля должно быть имеет то же значение. Но я не знаю, как сопоставить это значение из двух столбцов, чтобы добавить таблицу при использовании конфигурации, как указано выше.

Что касается нормальной работы Hibernate, когда он обрабатывает одну часть, он всегда генерирует два оператора insert, о котором я упоминал выше, а для вторичной таблицы - оператор insert, который содержит только те поля, которые указали его имя таблицы, поэтому для дополнения, это вставка утверждение:

insert into supplement(vernderPartNo, exportHSCCode, id) vaules (?,?,?) 

Итак, есть ли имеет какой-либо способ, чтобы Hibernate создания оператора вставки, как показано ниже:

insert into supplement(poNo, partNo, vernderPartNo, exportHSCCode, id) vaules (?,?,?,?,?) 
+0

по первому вопросу, Я ошибся в своем предыдущем тестировании, и я нашел, что использование @SecondaryTable может решить его уже, просто не устанавливайте значение для любых полей для таблицы дополнений, тогда hibernate пропустит, чтобы вставить запись в эту таблицу. – Aaron

ответ

0

1) Попробуйте следующее (я бы ожидать, что это работа, но Hibernate не может ay таким образом):

@Entity 
@Table(name="part") 
@SecondaryTable(name="supplement", pkJoinColumns ={@PrimaryKeyJoinColumn="id"}) 
public class Part{ 
    @Id 
    @GeneratedValue 
    private Integer id; 

    private String poNo; 

    private String partNo; 

    private String partDesc; 

    private String eccNo; 
    @Column(table="supplement") 
    @Basic(optional=true) 
    private String vernderPartNo; 
    @Column(table="supplement") 
    @Basic(optional=true) 
    private String exportHSCCode; 
    ... 
    getter and setter... 
} 

2) Вам нужно будет изменить, как ваша ключевая часть. Вы определили свой первичный ключ как автоматически увеличивающееся целое число ... это будет ваш внешний ключ в таблице дополнений. Это на самом деле то, как JPA хочет, чтобы вы это сделали (я говорю, что, поскольку спецификация JPA называет естественные ключи «наследием»). У вас есть несколько вариантов здесь:

  1. удалить автоинкрементный от лица части и создать «composite key» класс только с Pono и PARTNO, и добавить этот класс в качестве поля для части. Это станет основным ключом вашей части и будет внешним ключом, используемым в вашей таблице дополнений.
  2. Забудьте внешние ключи и вместо того, чтобы добавить @UniqueConstraint к вашей части для этих двух столбцов (это не собирается исправить иностранный ключевой вопрос, но это соблюдение ограничений вы определили)
+0

Спасибо, что ответили. для вопроса 1, я пробовал, как вы предлагали, но, к сожалению, это не сработало. У него все еще есть один оператор insert для вставки одной строки для дополнения.для вопроса 2 первым вариантом может быть решение, но оно не подходит для моего проекта. – Aaron