2016-04-23 2 views
0

У меня есть объект под названием Profile, чей первичный ключ должен быть фактически внешним ключом, указывающим на RegisteredUser.Добавить ограничение внешнего ключа для объекта в JPA

В настоящее время это, как я пытаюсь сказать, что поле в Profile является и его основным и внешним ключом ссылки RegisteredUser:

@Id 
@OneToOne 
@JoinColumn(foreignKey = @ForeignKey(name = "REGISTERED_USER_FK")) 
private RegisteredUser registeredUser; 

и в RegisteredUser сущности, у меня есть следующий:

@OneToOne(cascade = CascadeType.ALL, mappedBy = "registeredUser") 
private Profile profile; 

к сожалению, когда я бегу SpringBootApplication, я имею следующую ошибку:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'registered_user_username' cannot be null 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_40] 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_40] 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_40] 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) ~[na:1.8.0_40] 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404) ~[mysql-connector-java-5.1.38.jar:5.1.38] 
    at com.mysql.jdbc.Util.getInstance(Util.java:387) ~[mysql-connector-java-5.1.38.jar:5.1.38] 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:932) ~[mysql-connector-java-5.1.38.jar:5.1.38] 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878) ~[mysql-connector-java-5.1.38.jar:5.1.38] 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814) ~[mysql-connector-java-5.1.38.jar:5.1.38] 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478) ~[mysql-connector-java-5.1.38.jar:5.1.38] 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625) ~[mysql-connector-java-5.1.38.jar:5.1.38] 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551) ~[mysql-connector-java-5.1.38.jar:5.1.38] 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861) ~[mysql-connector-java-5.1.38.jar:5.1.38] 
    at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073) ~[mysql-connector-java-5.1.38.jar:5.1.38] 
    at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009) ~[mysql-connector-java-5.1.38.jar:5.1.38] 
    at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5094) ~[mysql-connector-java-5.1.38.jar:5.1.38] 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1994) ~[mysql-connector-java-5.1.38.jar:5.1.38] 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 
    ... 42 common frames omitted 

, когда я пытаюсь запустить этот код:

User user = new User("blah"); 
repo.save(user); // using repositories to store entities to the db 

Profile profile = new Profile(user.getFirstName()); 

RegisteredUser rUser = new RegisteredUser(user.getUsername(), profile); 
rur.save(rUser); 

Я проверил, чтобы увидеть, если имя пользователя пользователя имеет нулевое значение, но это не так ... Проблема заключается в том, когда я спасти rUser ...

+1

Столбец 'зарегистрированный_user_username' принадлежит к какой сущности,' RegisteredUser'? – aribeiro

+0

Почему вы отделяете профиль от пользователя? Может ли профиль существовать без объекта пользователя? – WeMakeSoftware

+0

@aribeiro Нет такой колонки.У меня есть поле в 'RegisteredUser' под названием' username', которое также должно быть первичным ключом 'RegisteredUser', но также должно быть внешним ключом, ссылающимся на первичный ключ' User' ... – nbro

ответ

1

В соответствии с JPA spec вы не можете комментировать RegisteredUser с аннотацией @Id.

Я не могу понять, почему вы должны отделить от профиля пользователя, но если вам действительно нужно сделать так, у вас есть несколько вариантов:

Вариант А:

@Embeddable Использование аннотаций на Profile. Вы не получите отдельную таблицу для объекта Profile, но вы получите отдельный объект в Java.

Вариант B:

Использование @ManyToOne на Profile. Таким образом, жизненный цикл пользователя будет что-то вроде этого:

  • Создать пользователь
  • Создать профиль
  • Сохранить профиль Профиль
  • Set пользователя к сохраненному
  • Сохранить пользователь

You могут даже иметь одни и те же первичные ключи на этих объектах (искать предложения here)

Вариант C:

Настройка @OneToOne, но забывают о требовании наличия обоих объектов, имеющих один и тот же первичный ключ.

Смежные вопросы