java - Hibernate一对多关系java.sql.SQLIntegrityConstraintViolationException : Column 'person_id' cannot be null

标签 java spring hibernate spring-mvc

我是 hibernate 新手,学习 doc 保存持久对象

已关注 hibernate doc这是人和电话的一对多关系

@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

最佳答案

添加 @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 切换为 none,然后将级联放在 Phone 上,如上所示。

您还应该在 Phone 实体上添加一个 @JoinColumn 注释,以便 hibernate 知道外键列。

关于java - Hibernate一对多关系java.sql.SQLIntegrityConstraintViolationException : Column 'person_id' cannot be null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53449592/

相关文章:

java - Spring MVC 中的自定义 HttpMessageConverter

spring - 从 Spring Boot 应用程序访问 SessionFactory

java - 报告 - 使用已弃用的字段、方法和类,即使使用 @SuppressWarnings 进行抑制

java - 如何使用邮件合并将符号从 Excel 获取到 Word

java - 获取最长的两个字符串

java - 收到 403 禁止错误

java - 不相关项目之间的共享依赖关系

java - 将 LocalDateTime 设置为使用 hibernate 4.3.10 自动生成

java - 生产者/消费者 : Consumer needs to remove elements from the shared Queue

java - 将工作委托(delegate)给其他人的单元测试类的最佳方法是什么?