Нулевой внешний ключ, в отношении ManyToOne с использованием аннотаций hibernate [4.1.1] - PullRequest
3 голосов
/ 24 марта 2012

Я пытаюсь сохранить отношение «один ко многим» и «многие к одному», используя Hibernate 4.1.1 , но внешний ключ всегда равен NULL .

Существует две сущности: Учетная запись и Клиент . У клиента может быть несколько учетных записей , а у учетной записи есть ровно один клиент .

Вот классы (только то, что имеет значение):

Account.java

@Entity
@Table(name = "account")
public class Account implements Serializable {
    private Client client;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    public long getId() {
        return id;
    }

    @ManyToOne
    @JoinColumn(name = "id_client")
    public Client getClient() {
        return client;
    }
}

Client.java

@Entity
@Table(name = "client")
public class Client implements Serializable {
    private List<Account> accounts;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    public long getId() {
        return id;
    }

    @OneToMany(mappedBy = "client", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    public List<Account> getAccounts() {
        return accounts;
    }
}

Test.java

session.beginTransaction();

Client client = new Client();
Account account1 = new Account();
Account account2 = new Account();

a.addAccount(account1);
a.addAccount(account2);

session.save(client);
session.getTransaction().commit();

Во время работы Hibernate добавляет внешний ключ в таблицу:

Hibernate: alter table account add index FKB9D38A2D3B988D48 (id_client), add constraint FKB9D38A2D3B988D48 foreign key (id_client) references client (id)

Обе учетные записи имеют столбец id_client NULL .

Я пытался поместить nullable = false в отношение @JoinColumn, но это только вызвало исключение.

Exception in thread "main" org.hibernate.exception.ConstraintViolationException: Column 'id_client' cannot be null

Ответы [ 2 ]

8 голосов
/ 25 марта 2012

Разобрался. Я забыл добавить клиента в учетные записи.

account1.setClient(client);
account2.setClient(client);

Теперь это работает. Спасибо за советы. ;)

0 голосов
/ 24 марта 2012

Я думаю, проблема в том, что сначала нужно сохранить аккаунт, а в последнем клиенте будет сохранен.

...