hibernate注解:一对多单向

本次实验环境:spring boot + spring data jpa + hibernate

本次实验用例:
  作者:
      id
      name
      messages
  消息
      id
      content

作者类中由消息类的成员属性,且该属性为复数,代码中使用list来表示。即一个作者有多个消息,一个消息只有一个作者。可以通过作者找到消息,但是不能通过消息找到作者,暂且如此规定。

#Author类:
@Entity
@Table(name="t_12n_author")
public class Author {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="author_id")
    private List<Message> messages;

    //getter与setter省略
}

即使我们在Author类里设置@JoinColumn,但在实际的生成表中,author_id字段存在于message表。。

#Message类:
@Entity
@Table(name="t_12n_message")
public class Message {

    @Id
    @GeneratedValue
    private Long id;

    private String content;

    //getter与setter省略
}
#生成表

这里写图片描述
这里写图片描述


CRUD:
  • 添加author,直接添加即可。
    Author author = new Author();
    author.setName("李四");
    authorDao.saveAndFlush(author);
  • 更新author,假如现在我们要把作者名从“李四”改为“张三”,若直接通过id更新,此时messages的为默认值,数据库中message表的对应数据的author_id字段会被更新为null。
    所以必须确保除了要更新的字段的其余字段要与数据库中原有字段一致,采取的做法是先查后更新。Author findOne = authorDao.findOne(2L);
    findOne.setName("张三");
    authorDao.saveAndFlush(findOne);
  • 删除author,必须把这个author的所有message也一同删除,保持数据的一致性,避免脏数据。因为设置了cascade,直接删除author会级联删除message。
  • 查询author,@OneToMany默认为懒加载,我们直接findOne只会把id和name查询出来,messages无数据。如果此时对查询出的author操作中,涉及到messages,则会报错,错误是no session。
    原因是涉及到了messages,懒加载在此时才会去数据库中把相关的message数据查询,但是findOne已经结束了,session已经关闭,无session可用也就报no session的错误,解决方法是保证findOne时使用的session不关闭。
    如上的代码中设置了急加载,覆盖了默认的懒加载,即findOne的时候连同message的记录一起查出。
    Author findOne = authorDao.findOne(1L);
    System.err.println(findOne.getName());
  • 添加message,虽然在message表中有author_id字段,但在java代码中无法设置authorId,所以直接添加message的方式行不通,如果自行实现hql或sql语句是可以的,但是我们这里只使用封装好的saveAndFlush方法。
    故我们只能通过authorDao来实现添加message。
    Author author = authorDao.findOne(3L);
    Message message = new Message();
    message.setContent("aaaa");
    author.getMessages().add(message);
    authorDao.saveAndFlush(author);
  • 更新message,直接通过id更新message即可,因为java的Message类中无author的id,生成的更新语句中也没有author_id字段相关内容,不会对该字段有影响。
  • 删除message,直接通过id删除即可。
    messageDao.delete(2L);
  • 查询message,在查询author时使用了急加载,已经把该author的所有message查出。如果要查单个message,当然可以通过id来查,但是查出的数据没有author相关的内容,只有其本身的id和content属性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值