Нарушение ограничения ссылочной целостности при сохранении - PullRequest
0 голосов
/ 30 ноября 2018

Мне нужна ваша помощь, потому что я не могу понять, в чем дело, и это меня раздражает. Я создаю две таблицы с взаимно-однозначным отношением по liquibase:

    <changeSet id="create user_profile_info table" author="aarexer">
    <createTable tableName="user_profile_info">
        <column name="id" type="BIGINT" autoIncrement="true">
            <constraints primaryKey="true" nullable="false"/>
        </column>
        <column name="user_id" type="BIGINT"/>
    </createTable>
</changeSet>


<changeSet id="create users table" author="aarexer">
    <createTable tableName="users">
        <column name="id" type="BIGINT" autoIncrement="true">
            <constraints primaryKey="true" nullable="false"/>
        </column>
    </createTable>

    <addForeignKeyConstraint baseColumnNames="id"
                             baseTableName="users"
                             constraintName="fk_user_to_user_profile"
                             referencedColumnNames="user_id"
                             referencedTableName="user_profile_info"/>
</changeSet>

И пишу для него Java-сущности сэто отношение, это UserProfileInfo:

@Data
@Entity
@Table(name = "user_profile_info")
public class UserProfileInfo implements Serializable {
    @Id
    @GenericGenerator(name = "native", strategy = "native")
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
    private Long id;

    public UserProfileInfo() {
    }

    public UserProfileInfo(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}

И это User сущность:

@Data
@Entity
@Table(name = "users")
public class User implements Serializable {
    @Id
    @GenericGenerator(name = "native", strategy = "native")
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
    private Long id;

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "id", referencedColumnName = "user_id")
    private UserProfileInfo userProfileInfo;

    // Hibernate requires a no-arg constructor
    public User() {

    }

    public User(String firstName) {
        this.firstName = firstName;
    }
}

Это одна направленная ссылка, от User до UserProfile.

На первый взгляд все хорошо, но когда я пытаюсь сохранить его:

UserProfileInfo entity = new UserProfileInfo("98518872");
        User user = new User("Aleksandr");
        user.setUserProfileInfo(entity);

        userRepository.save(user);

Я вижу Referential integrity constraint violation причина ошибки fk_user_to_user_profile.

Что не так?

Я создаю объекты user и user_info, связываю их с помощью сеттеров и получаю граф объектов.И я не могу сохранить свой график.

Я думаю, что это может быть ошибка в addForeignKeyConstraint, потому что, когда я удаляю это ограничение, оно работает (и это понятно), но как я должен сохранять объекты с ограничениями на таблицы?

Пожалуйста, помогите мне понять мою ошибку.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Я изменяю свою миграцию ликвидазы и устанавливаю ограничение для столбца:

    <column name="user_id" type="BIGINT">
        <constraints references="users(id)" foreignKeyName="fk_user_to_user_profile"/>
    </column>

После этого все работает нормально и сохраняю свой график объектов

0 голосов
/ 30 ноября 2018

У меня была та же самая проблема, и действительно трудно понять причину.Что исправило мою проблему, добавив nullable false в @JoinColumn

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "id", referencedColumnName = "user_id", nullable = false)
private UserProfileInfo userProfileInfo;
...