Hibernate отношение один ко многим java.sql.SQLIntegrityConstraintViolationException: столбец person_id не может быть пустым - PullRequest
0 голосов
/ 23 ноября 2018

Я новичок в спящем режиме, изучаю документ, сохраняю постоянный объект

, затем Документ в спящем режиме это отношения между человеком и телефоном один-ко-многим

@Entity
@Table(name = "phone")
public class Phone {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "number")
    private String number;

    @ManyToOne(fetch = FetchType.LAZY)
    private Person person;

  //omit setter and getter
}

@Entity
@Table(name = "person")
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String username;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "person")
    private List<Phone> phones = new ArrayList<>();
   //omit getter and setter 
}

Я настойчивый человек и добавляю один телефон с ошибкой, кидайте

@Test
public void say() {
    Person person = new Person();
    person.setUsername("aaaa");

    Phone phone = new Phone();
    phone.setNumber("111");

    person.getPhones().add(phone);

    personService.save(person);
}

это Дао настойчивый

public class PersonDaoImpl implements PersonDao {
    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public void save(Person person) {
        entityManager.persist(person);
}

Обновите код службы, служба просто спасет человека

@Service(value = "personService")
public class PersonServiceImpl implements PersonService {
    @Autowired
    private PersonDao personDao;

    @Transactional
    @Override
    public void save(Person person) {
        personDao.save(person);
    }
}

информация об ошибке:

    23:35:47.059 [main] DEBUG org.hibernate.engine.spi.ActionQueue - Executing identity-insert immediately
23:35:47.062 [main] DEBUG org.hibernate.SQL - 
    insert 
    into
        phone
        (number, person_id) 
    values
        (?, ?)
23:35:47.297 [main] DEBUG org.hibernate.engine.jdbc.spi.SqlExceptionHelper - could not execute statement [n/a]
java.sql.SQLIntegrityConstraintViolationException: Column 'person_id' cannot be null

erro img info

Ответы [ 5 ]

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

Вы что-то пропустили.Вы можете попробовать это.

Персона Entity

@Entity
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String username;

    @OneToMany(mappedBy = "person")
    private List<Phone> phones = new ArrayList<>();

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public List<Phone> getPhones() {
        return phones;
    }

    public void setPhones(List<Phone> phones) {
        this.phones = phones;
    }
    //omit getter and setter
}

Phone Entity

@Entity
@Table(name = "phone")
public class Phone {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column(name = "number")
    private String number;

    @ManyToOne(cascade = CascadeType.PERSIST)
    private Person person;

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    //ommit setter and getter
}

Phone Dao

public interface PhoneDao {
    public Phone save(Phone phone);
}

PhoneDaoImpl

@Repository
public class PhoneDaoImpl implements PhoneDao {
    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public Phone save(Phone phone) {

        return entityManager.merge(phone);
    }
}

PersonDaoImpl

@Repository
public class PersonDaoImpl implements PersonDao{
    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public Person save(Person person) {

        return entityManager.merge(person);
    }
}

Метод испытания

@Test
    @Transactional
    @Commit
    public void say()
    {
        Phone phone = new Phone();
        phone.setNumber("jghjkhk");

        Person person = new Person();
        person.setUsername("7576");

        phone.setPerson(person);
        Phone pers = phoneDao.save(phone);
        Assert.assertNotNull(pers);
    }

Попробуйте сейчас.Это будет работать.

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

Поскольку у вас нет какого-либо типа генерации в вашем @Id, а id является первичным ключом, который не может быть нулевым, поэтому вы должны либо установить значение id, либо добавить аннотацию @GeneratedValue в поле id и установить стратегию либо как Autoили Identity.

Вы также можете создать собственную последовательность.

Кроме того, вам нужно сделать то же самое для класса Phone.

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

Обычно люди в спящем режиме автоматически устанавливают идентификатор сущности с помощью суррогатного ключа.

public class Person {
    @Id @GeneratedValue   // should pick an appropriate strategy here
    private long id;

Поскольку у вас его нет, вы должны либо добавить его, либо установить его самостоятельно.

 Person p = new Person();
 p.setId(1);   // hopefully unique

То же самое относится и к телефону.

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

Добавьте аннотацию @GeneratedValue, чтобы указать, что первичный ключ для обеих сущностей будет заполняться вне вашего кода.

@Entity
@Table(name = "phone")
public class Phone {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    @Column(name = "number")
    private String number;

    @JoinColumn("person_id")
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Person person;

  //omit setter and getter
}


public class Person {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;
    private String username;

    @OneToMany(mappedBy = "person")
    private List<Phone> phones = new ArrayList<>();
   //omit getter and setter 
}

Кроме того, вам необходимо сохранить объект Person вместо Phone объект, потому что нет каскада, настроенного от Phone до Person.Если вы не можете этого сделать, переключите CascadeType на Person на none и поместите каскад на Phone, как показано выше.

Вы также должны добавить аннотацию @JoinColumn на Phone сущность, поэтому hibernate знает о столбце внешнего ключа.

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

Я думаю, что вам нужно установить значение person-> id, а затем использовать метод get для передачи идентификатора вашему объекту телефона вместо передачи объекта person

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...